位运算

位运算符和移位

Posted by Ted on October 13, 2015

一、位运算符

位取反(NOT)~

取反是一元运算符,对一个二进制数的每一位执行逻辑反操作。使数字1成为0,0成为1。

NOT 0111(十进制7)
  = 1000(十进制8)

值得注意的是此操作符与”逻辑非(!)”操作符不同

按位或(OR)|

按位或处理两个长度相同的二进制数,两个相应的二进位中只要有一个为1,该位的结果值为1。例如

        0101(十进制5)
     OR 0011(十进制3)
      = 0111(十进制7)
这一操作符需要与逻辑或运算符(   )区别开来

按位与(AND)&

按位与处理两个长度相同的二进制数,两个相应的二进位都为1,该位的结果值才为1,否则为0。例如:

         0101
     AND 0011
       = 0001

按位异或(XOR)^

按位异或运算,对等长二进制模式按位或二进制数的每一位执行逻辑异按位或操作。操作的结果是如果某位不同则该位为1,否则该位为0。例如

     	 0101
     XOR 0011
       = 0110

二、移位

移位是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。在类C语言中,左移使用两个小于符号”«“表示,右移使用两个大于符号”»“表示。

逻辑移位

应用逻辑移位时,移位后空缺的部分全部填0。

       0001(十进制1)
 <<       3(左移3位)
     = 1000(十进制8)
       1010(十进制10)
 >>       2(右移2位)
	 = 0010(十进制2)

算术移位

算术移位要保证符号位的不改变(逻辑左移位补0, 逻辑右移位看符号位),算术移位和逻辑移位最大的区别,是算术移位在右移时不改变原来的数的符号而逻辑移位在右移时有可能改变原来的数的符号

img

img