上一篇,我们一起学习了正数的位运算知识,本篇我们继续学习负数的位运算。
为了方便计算,假定使用8位机器数。这里我们先定义两个变量保存负数,并求得它们的原码、反码和补码,下文演示就直接使用变量:
定义变量a = -5,b = -7a的二进制原码:1000 0101,二进制反码为:1111 1010,二进制补码为:1111 1011b的二进制原码:1000 0111,二进制反码为:1111 1000,二进制补码为:1111 1001
按位与运算,“与”理解为“并且”的意思,即对应数位的两个数,第一个是1并且第二个也是1,结果才是1。求a&b的值?
我们先拿1111 1011与1111 1001 的首位比较,第一个数为1,并且第二个数也为1,那么结果记作1;然后再往右比较第二位,就这样依次比较完所有位,最后得到结果为:1111 1001。
注意这个结果是补码形式,需要转化为原码,再转化为十进制数。而求补码的原码,只需要对补码再求一次补码就可以了。
1111 1001的反码为1000 0110,补码为1000 0111,转化为十进制数为-7,也就是说a&b的结果是-7。黑窗口演示python运行结果如下:
负数的按位与运算演示 按位或运算,“或”理解为“或者”的意思,即对应数位的两个数第一个是1,或者第二个是1,则结果是1。求a|b的值?
我们先拿1111 1011与1111 1001 的首位比较,第一个数为1,或者第二个数为1,那么结果记作1;然后再往右比较第二位,就这样依次比较完所有位,最后得到结果为:1111 1011。
同样地,需要求1111 1011的补码。先求反码为1000 0100,补码为1000 0101,转化为十进制数为-5,也就是说a|b的结果是-5。黑窗口演示python运行结果如下:
负数的按位或运算演示 按位异或运算,“异”理解为“不同”的意思,即对应数位的两个数不相等则结果为1。求a^b的值?
我们先拿1111 1011与1111 1001 的首位比较,第一个数为1,第二个数为1,两数相同,记作0;然后再往右比较第二位,就这样依次比较完所有位,最后得到结果为:0000 0010。
同样地,需要求0000 0010的补码。而二进制数的最高位是符号位,0代表正数,1代表负数,而正数的原码和反码和补码相等,所以它的补码也是0000 0010,转化为十进制数就是2,也就是说a^b的结果是2。黑窗口演示python运行结果如下:
负数按位异或演示 按位取反运算,“反”理解为“相反”的意思,即二进制的所有数位1变为0,0变为1。求~a的值?
我们拿1111 1011取反得到0000 0100,同样地这个数也是补码,由于是正数,所以原码也是它,转化为十进制数是4,即~a的结果是4。黑窗口演示python运行结果如下:
负数按位取反运算演示 好了,本期关于负数的位运算符的学习就结束了,各位友友学会了么?欢迎大家在评论区留言讨论交流。我是程序媛小敏,持续为您分享python知识干货。