一、位运算的概念
与运算的基本格式为:a & b
0&0=0 0&1=0 1&1=1
我们直接看一道题
//FileName: chap10_3.c
#include <stdio.h>
int main( )
{
int a=84,b=59,c;
c=a&b;
printf("a=%d\t b=%d\t c=%d\n",a,b,c);
return 0;
}
程序运行结果如下: a=84 b=59 c=16
与运算的基本格式为:a | b
0|0=1 0|1=1 1|1=1
//FileName: chap10_4.c
#include <stdio.h>
int main( )
{
int a=060;
int b=017;
int c;
c=a|b;
printf("a=%d\t b=%d\t c=%d\n",a,b,c);
return 0;
}
程序运行结果如下: a=48 b=15 c=63
与运算的基本格式为:a ∧ b
0^0=0 0^1=1 1^1=0
//FileName: chap10_5.c
#include <stdio.h>
int main()
{
int a=071;
int b = 052;
int c;
c=a^b;
printf("a=%d\t b=%d\t c=%d\n",a,b,c);
return 0;
}
程序运行结果如下: a=57 b=42 c=19
与运算的基本格式为: ~ a
~1=0 ~0=1
//FileName: chap10_7.c
#include <stdio.h>
int main()
{
int a=077;
printf("%d",~a);
return 0;
}
程序运行结果如下: 192
与运算的基本格式为: a<<n
功能:左移运算符是用来将一个数的各二进制位左移若干位,移动的 位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补, 高位左移溢出则舍弃该高位。
与运算的基本格式为: a>>n
功能:右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。
我们看一道例题
编写程序实现对-9右移1位的功能。
分析:
当对负数进行右移操作,左端补1不补0。-9右移一位的过程如下:
①-9的原码形式: 1000000000001001 最高位的1表示该数为负数
②-9的反码形式: 1111111111110110 最高位不变,其余各位取反
③-9的补码形式: 1111111111110111 对反码加1
④右移1位-9>>1: 11111111111110111 挤掉右端1位,左端补1
⑤求-9>>1的反码: 1111111111111010 对补码减1而得
⑥求-9>>1的原码: 1000000000000101 反码最高位不变,其余取反 因此,-9>>1的值由-9变为-5。