JAVA位运算非完全详解

JAVA位运算

  • 8进制:0开头整数,做多是7
  • 16进制,以0x开头,做多是F,不管X还是x都可以,依照个人习惯即可
  • Java使用 补 码 来 表 示 二 进 制 数 ,在补 码 表 示 中 ,最高 位 为 符号 位 ,正数 的 符 号 位 为 0,负数 为 1。补 码 的 规 定 如 下 :

1、对 正 数 来 说 ,最高位为 0,其余 各 位 代 表 数 值 本 身 (以二 进制 表 示 ),如 +42的补码 为 00101010。

2、对 负 数 而 言 ,把该 数 绝 对 值 的 补 码 按 位 取 反 ,然后 对 整 个数 加 1,即得 该 数的 补 码 。如 -1的补 码 为11111111111111111111111111111111(计算过程:00000000000000000000000000000001按 位 取 反 11111111111111111111111111111110+1=11111111111111111111111111111111 )。

对于正数来说首位为0代表符号位,表示正数
对于负数来说首位为1代表符号位,表示负数
为何有那么多0、1,java中int是32位的,对于+42而言,因为是正数,不需要取反,所以只需要8位就足以表示,而-1需要取反,所以需要扩充至32位

按位运算

  • 1、按位 并(AND):&,把每一位按照AND进行,0是false,1是true,两个数按二进制计算,一旦有一位是0,则结果是0
操作 第一位 第二位 第三位
操作数1 0 0 1
操作数2 0 1 1
按位与(&) 0 1 1

例如:十进制10按位与十进制12–>
     二进制1010按位与二进制1100–>
            二进制结果1000–>
               十进制结果8–>
                    结束
   十进制-6按位与十进制-2–>
        二进制-6的绝对值是110,-2的绝对值是10–>
             二进制-6补码为:扩充至32位并取反并+1:11111111111111111111111111111010
            二进制-2的2补码为:扩充至32位并取反+1:11111111111111111111111111111110             按位于的结果为:1111111111111111111111111111010
            由于首位为1,代表负数,所以需要获取源码,步骤为:-1后取反
            结果为:1111111111111111111111111111001取反
            结果为:000000000000000000000000110
            最后加上符号,结果为:-6
            结束
正数与负数进行按位与(&)操作,原理同上,只需要看按位与之后的首位来判断符号。

  • 按位 或(OR):|,把每一位按照OR进行,0是false,1是true,两个数按二进制计算,一旦有一位是1,则结果是1
操作 第一位 第二位 第三位 第四位
操作数1 0 0 1 1
操作数2 0 1 0 1
按位或(|) 0 1 1 1
  • 按位 异或(XOR):^,把每一位按照OR进行,0是false,1是true,两个数按二进制计算,两位不一样是1,一样是0
操作 第一位 第二位 第三位 第四位
操作数1 0 0 1 1
操作数2 0 1 0 1
按位或(|) 0 1 1 0
  • 按位 取反(按位非):~,每一位取反
操作 第一位 第二位
操作数1 0 1
按位非(~) 1 0

位移运算符

  • 符号: >>>:无符号右移,符号位一起右移,左边补0,
    低位溢出,高位补0。注意,无符号右移(>>>)中的符号位(最高位)也跟着变,无符号的意思是将符号位当作数字位看待。如:-1>>>1结果为2147483647。这个数字应该比较熟悉,看两个输出语句就知道是什么了:

System.out.println(Integer.toBinaryString(-1>>>1));

System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));

输出结果为:

1111111111111111111111111111111

1111111111111111111111111111111

  • 符号:>>:带符号右移,符号位不动,其余位右移,符号位后高位正数补0,负数补1
    例如:10进制-6转换为1110,其中第一位1为符号位,负数进行右位移,获取其二进制补码,右移后高位补符号位,最后符号位不变,减一后按位取反
  • <<:左移,低位补0
  • 例如:2<<2结果即为8,十进制2转换成2进制为0010,左移两位。实际上使用计算的不是4位或8位,使用的是32位进行的位移
  • 右移可以忽略

你可能感兴趣的:(JAVA位运算非完全详解)