Java 和 C 中的位运算符

来源:互联网 发布:新网域名过户方法 编辑:程序博客网 时间:2024/06/08 07:30
运算符

位运算符是用来对字节或字节中的位进行运算的符号,参加位运算的操作数必须是整型常量或变量。通常,我们把要进行位运算的变量说明为 unsigned 类型。C 语言提供了六种运算符。他们是位与(&)、位或(|)、位异(^)、左移(<<)、右移(>>)和取反(~)。这六种运算符的运算规则如下:
位与(&):
两个相应位上的值全 1,则改位的结果值为 1,否则为0。即:
1&0为 0, 0&1 为 0,0&0为0, 1&1为1
位或(|):
两个相应位上的值全0,则该位的结果值为0,否则为1.即:
1|0为1,0|1为1,0|0为0,1|1为1
位异(^):
两个相应位上的值相同,则该位的结果值为0,不相同为1.即:
1^1为0,0^0为0,1^0为1 0^1为1
左移(<<):
是用来将左操作数的各个二进制位按右操作数给出的值向左移动。操作数移位后,右端出现的空位补零,而移出左端的高位被舍弃。例如:
设 a 的值为十进制数 15,即二进制 00001111,则 a << 2 后得 00111100,即十进制数字60。
右移(>>)
是用来将左操作数的各个二进制数按右操作数给出的值向右移动。操作数移位后,左端出现的空位补零,而移出右端的低位被舍弃。例如:
设b的值为十进制数字28,即二进制数 00011100,则 b >> 2后得 00000111,即十进制数字7。
取反(~)
是用来将操作数按位取反,即操作数的相应位上的值为1时变换成0,为0时变换成1,即 ~0 为1,~1为0。

通过上面的介绍,现对位运算符的运算规则做一小结。如下:

运算符名称    
预算规则
&    
位与
两个相应位全 1 为 1,其余为 0
|
位或
两个相应位全 0 为 0,其余为 1^
位异或
两个相应位相同为 0,不相同为 1<<
左移    
把左操作数左移指定的位数
>>
右移
把左操作数右移指定的位数~
取反
把操作数各位 0 变 1,1 变 0。





下面举一个位运算符的应用示例。
例题:
写一个程序,将整数 x 的低字节作为整数 z 的低字节,整数 y 的低字节作为整数 z 的高字节。

步骤:
a. 将整数 x 的低字节取出,高字节置零。即
   x & 0x00ff
b. 将整数 y 的低字节移至高字节,低字节再置零。即
   (y & 0x00ff)<<8
c. 将上面两者的结果进行合并。即
   (x & 0x00ff) | (y & 0x00ff) <<8

程序如下:
main()
{
  unsigned x,y,z;
  x=0x0531; y=0xabcd
  z=(x & 0x00ff) | (y & 0x00ff) << 8;
  printf("%x/n",z);
}
运行结果如下:
cd31