以下属于个人理解,也经过测试,如果错误还请谅解,再次温习了大学的基础知识
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)