与(&) 、或(|)、异或(^) 、取反(~) 运算

  • Post author:
  • Post category:其他

一、与(&)

参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
例如:15&5 即 0000 1111 & 0000 0101 = 0000 0101 因此,3&5的值得5。

负数按补码形式参加按位与运算。

二、或(|)

参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7。

负数按 补码 形式参加按位或运算。

补充

!!!补码是what
1、数据存储在内存中都是存储的二进制,二进制又可分为原码、反码、补码。最终存储在内存中的是“补码”。
2、二进制的第一位是符号位,0代表正数,1代表负数。
3、正数:原码=反码=补码

例如:9 == int == 4个字节 == 1个字节等于8位 == 整型有32位
正数的原码:
0000 0000 0000 0000 0000 0000 0000 1001
正数的反码就是正数的原码:
0000 0000 0000 0000 0000 0000 0000 1001
正数的补码也是正数的原码:
0000 0000 0000 0000 0000 0000 0000 1001

4、负数: 原码 = 补码取反加1,补码 = 原码取反加1

例如:-9
原码为首位为1的二进制数:
1000 0000 0000 0000 0000 0000 0000 1001
反码为符号位不变,其他位取反:
1111 1111 1111 1111 1111 1111 1111 0110
补码是反码加1:
1111 1111 1111 1111 1111 1111 1111 0111

三、异或(^)

参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;

交换律:A ^ B=B ^ A
结合律:A ^ B ^ C=A ^ (B ^ C)=(A ^ B) ^ C
自反律:A ^ B ^ B=A ^ 0=A
自反律:X ^ X=0 ,X ^ 0=X

四、取反(~)

参加运算的一个数据,按二进制位进行“取反”运算。
运算规则:~1=0; ~0=1;

使一个数的最低位为零,可以表示为:a&~1。
~ 1的值为1111 1111 1111 1110,再按“与”运算,最低位一定为0。因为“~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。

补充

>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
正数: r = 20 >>> 2 的结果与 r = 20 >> 2 相同;

负数: r = -20 >>> 2
注:以下数据类型默认为int 32位
  -20:源码:10000000 00000000 00000000 00010100

    反码:11111111  11111111   11111111   11101011

    补码:11111111  11111111   11111111   11101100

    右移:00111111  11111111   11111111   11111011

    结果:r = 1073741819

版权声明:本文为Guxiaodong_single原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。