位运算和逻辑运算

1、原码补码反码

正数 负数
原码 符号位为0 符号位为1
补码 原码 符号位不变,其他取反
反码 原码 补码+1

比如说:

5的原码: 00000000 00000000 00000000 00000101

-5的原码: 10000000 00000000 00000000 00000101

5的反码:00000000 00000000 00000000 00000101
-5的反码:11111111 11111111 11111111 11111010

5的补码:00000000 00000000 00000000 00000101

-5的补码:11111111 11111111 11111111 11111011

int i = 5;
int j = -5;
System.out.println(Integer.toBinaryString(i));
//101  之前的29位全0被忽略了

System.out.println(Integer.toBinaryString(j));
//11111111111111111111111111111011

2、位运算和逻辑运算

2.1、位运算

位运算是将数据先转化为二进制数补码形式,再逐位(bit)按规则计算

符号 描述 运算规则
& 按位与 两个位都为1时,结果才为1
| 按位或 两个位都为0时,结果才为0
^ 按位异或 两个位相同为0,相异为1
~ 按位非 0变1,1变0
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
1、与(&) 全1则1,否则为0
2、或(|)全0则0,否则为1
3、异或(^) 相同为0,不同为1。
  • 交换律 a ^ b = b ^ a
  • 结合律(a ^ b) ^ c == a ^ (b ^ c)
  • 对于任何数x,都有 x ^ x = 0, x ^ 0 = x
  • 自反性 A ^ B ^ B = A ^ 0 = A --> A ^ B = C 则 C ^ B = A
4、取反 (!) 遇1则0,遇0则1

2.2、逻辑运算

逻辑运算符执行的是短路求值,当左边操作数可以推断出表达式的值,就不再执行 了

public static void main(String[] args) {
    // 逻辑运算符执行的是短路求值,当左边操作数可以推断出表达式的值,就不再执行 了
    int x, y = 10;
    if (((x = 0) == 0) || ((y = 20) == 20)) {
        System.out.println(y);// 输出10
    }

    // 位操作运算不管值是如何,任何参与运算的表达式都会被执行求值
    int a, b = 10;
    if (((a = 0) == 0) | ((b = 20) == 20)) {
        System.out.println(b);// 输出20
    }
}
1、逻辑与(&&)

全真则真

2、逻辑或(||)

全假则假

3、逻辑非(!)

真假互换

3、几个位运算操作

  • 将x最右边的n位清零 x & (~0 << n)
  • 获取x的第n位的值(0或1)(x >> n) & 1
  • 仅将第n位置为1 x | (1 << n)
  • 仅将第n位置为0 x & (~(1 << n))
  • 将x最高位到第n位(含)清零 x & ((1 << n) - 1)
  • 将第n位到第0位(含)清零 x & (~((1 << (n + 1)) - 1))
  • 去除二进制 i 的最后一个1,该数一定比 i 小:i & (i - 1)
posted @ 2021-03-18 11:55  CRboyfriend  阅读(245)  评论(0)    收藏  举报