以下属于个人理解,也经过测试,如果错误还请谅解,再次温习了大学的基础知识


1  非(~)运算符的计算:

补充说明,

1:最高位为0代表正数,最高位为1的代表负数


2:已知一个数的补码,求原码的操作分两种情况: 
	(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。 
	(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取
	反,然后再整个数加1。

举例 int a = 5, 输出的 ~a = -6;

计算原理:5 转化为二进制是 0000 0101,~运算规则是按位取反,那么为 1111 1010,此时仍为补码,是计算机系统的

存储模式,我们需要的结果是需要将补码转化为原码,换算过程:按位取反1000 0101 再整个+1,故原码为 

1000 0110 = -6(最高位为负,二进制转化为十进制为6)

2  与(&)运算符的计算:

正数与正数之间相与,很简单,直接转化为二进制数,按位与即可

正数与负数之间相与:

补充说明:负数的原码 = 即用第一位表示符号, 其余位表示值; 

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

负数的补码=在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1) 

正数的反码 = 补码 = 原码


demo

7

-7

原码

00000111

10000111

反码

00000111

11111000

补码

00000111

11111001


举例 int a = 5,int b = -3; 输出的 a&b = 5;

计算流程:5的二进制形式为:0000 0101,(补码)

-3的二进制形式为:1111 1101,(补码:按位取反+1) (计算机是以补码的形式存储,用补码计算)

计算结果为:0000 0101 (正数,结果转化为原码 = 5)

-5的二进制形式为:1111 1011,

-3的二进制形式为:1111 1101,(按位取反+1) (计算机是以补码的形式存储,用补码计算)

计算结果为:1111 1001 (负数,结果转化为原码 (符号位不变,按位取反+1)1000 0111 = -7)


3:或(|)运算符的计算:

经过上面两个与(&)运算和非(~)运算,或运算就小case了

上面第一个例子 5 | (-3)结果就是1111 1101(负数,结果转化为原码 (符号位不变,按位取反+1)1000 0011 = -3)