Skip to content

3 位运算符

发布时间:

位运算

  • 位运算符与(&)
    将两个操作数转换为二进制形式进行运算,当两个操作数对应位都是1的时候结果数位才为1,否则为0。

  • 位运算符或(|)
    将两个操作数转换为二进制形式进行运算,当两个操作数对应位都是0的时候结果数位才为0,否则为1。

  • 位运算符异或(^)
    将两个操作数转换为二进制形式进行运算,当两个操作数对应位不同的时候结果数位为1,否则为0。

  • 按位取反(~)

    1. 简便计算方法,~a=-(a+1);
    2. 原理要了解,原码、反码、补码, 原数转二进制后每一位取反,即1为0,0为1,最高位取反改变符号位,取反后最高位为0的,直接转为10进制格式。最高位为1的为负数,是以补码形式转为10进制形式。
  • 左移运算符(<< )
    将操作数转换为二进制形式进行运算,整体二进制位向左移动,右边补0,当改变符号位时,数变化较大,位移后,负数按补码形式取值。
    注意: int 类型的数据进行左移的时候,当左移的位数大于等于32位的时候,位数会先求余数,然后再进行左移。

  • 右移运算符(>> )
    带符号右移动
    正数右移:与无符右移一样,整体右移左边补0。
    负数右移:求补码-->右移左边全补1--> 符号位不变取反加1-->以源码形式转10进制。

例:右移运算符运算 -100>>4
10000000 00000000 00000000 01100100 原码
11111111 11111111 11111111 10011100 补码 (符号位不变,余位取反加1 )
11111111 11111111 11111111 11111001 右移4位,在高位补1
10000000 00000000 00000000 00000110 保留符号位,然后按位取反
10000000 00000000 00000000 00000111 然后加1,即为所求的原码
结果为:-7

  • 无符号右移运算符(>>> )
    无符号右移运算符和右移运算符是一样的,不过无符号右移运算符在右移的时候是补0的,而右移运算符是补符号位的

例:100 无符号右移 4位
00000000 00000000 00000000 01100100 //100 源码补码均为:
00000000 00000000 00000000 00000110 //右移四位:
结果为:6

例:-100无符号右移4位
10000000 00000000 00000000 01100100 //-100原码:
11111111 11111111 11111111 10011100 //-100补码: 保证符号位不变,其余位置取反并加1
00001111 11111111 11111111 11111001 // 无符号右移4位:在高位补0
结果为:268435449