Java位运算

1 位运算符

1.1 位运算符

&:按位与。

|:按位或。

~:按位非。

^:按位异或。

<<:左位移运算符。

>>:右位移运算符。

<<<:无符号右移运算符。

位运 算 符 中 ,除 ~ 以 外 ,其余 均 为 二 元 运 算 符 。 操 作 数 只 能 为 整 型 和字 符 型 数 据 。

  • Java使用补码表示二进制数,在补码表示中,最高位为符号位 ,正数 的 符 号 位 为 0,负数 为 1。补 码 的 规 定 如 下 :
    • 对正数来说 ,最高位为 0,其余各位代表数值本 身 (以二 进制 表 示 ),如 +42的补码 为 00101010。
    • 对负数而言,把该数绝对值的补码按位取反加一,即得该数的补码。 如-1的补码为11111111111111111111111111111111 (绝对值1的补码00000000000000000000000000000001按位取反加一 11111111111111111111111111111110+1=11111111111111111111111111111111 )。负数补码求源码:符号位不变,减一后按位取反。
1.2 按位与&
  • 规则
    Java位运算
    只有两个操作数对应位同为1时,结果为1,其余全为0。

  • 举例
    Java位运算

1.3 按位或 |
  • 规则
    Java位运算
    只要有一个操作数为1,结果就为1。
1.4 按位非 ~
  • 规则:按位取反
1.5 按位异或
  • 规则:
    Java位运算
    两数不相同时为1。
1.6 左位移 <<
  • 符号位不变,低位补0,高位溢出截断
    Java位运算
  • 当移动的位数超过数字本身的位数时,那么不就都需要补0操作?实际上不是的,java不可能做那么浪费资源的事情。在真正执行位移前,其对要移动的位数做了一些预处理,比如32处理为0,-1处理为31。
1.7 右位移 >>
  • 符号位不变,低位溢出,高位用符号位补齐
    Java位运算
1.8 无符号右移 >>>
  • 无符号右移中符号位当做数字,低位溢出,高位补0。
    Java位运算
    -1 >>> 1 得int所能表示的最大整数。

2 常见使用

1. 判断奇偶性
  • n&1 == 1 ? ”奇数” : ”偶数”

    偶数的最低位肯定是0,同理,奇数的最低位肯定是1。

【转载】https://www.cnblogs.com/findbetterme/p/10787118.html