每个人的Python:数学、算法和游戏编程训练营
上QQ阅读APP看书,第一时间看更新

4.1.2 编程实现——求十进制数的反码

补码与反码是数字存储的一种机制。每个十进制数都可以使用二进制表示,所谓反码,是指将十进制数用二进制表示,并且将每一个二进制位进行取反操作。例如5的二进制表示为101,其反码为010。现在,输入一个十进制数字,返回其反码对应的十进制数字。例如对于数字5,其反码为010,即最终返回的结果为十进制数2。

按照常规的思路解决本题的话,我们可以将输入的十进制数转成使用0和1表示的二进制数,再分别对每一位进行取反运算,将最终得到的结果再转回十进制数返回。这样的做法思路清晰,但是比较烦琐,因为我们要获取的是反码,即进行取反操作,那么可以从取反操作的性质入手。

首先,对于取反操作来说,如果原位是0,则取反后会变成1,如果原位是1,则取反后会变成0,这种效果与将每一位数字与1进行异或运算得到的结果是一致的。例如,假设输入的数值是5,其二进制表示为101,我们将其与111进行异或运算(对应的位如果相同,则运算结果为0,不同则为1),得到的结果为010,与取反得到的结果一样。因此,我们可以使用Python中的异或运算来快速解决本题,现在只需要解决一个问题,即确定要与之进行异或运算的数的大小。

示例代码如下:

如以上代码所示,我们使用while循环来构造要与原数进行异或的数值,其中使用“<<”运算符来进行按位左移运算,这样可以构造出每一个二进制位都是1的数字。

通过本题的练习,我们可以体会到,在编程中,按位运算其实应用的地方并不多,但是对于某些特殊场景,按位运算可以极大地提高效率。要灵活地使用按位运算,一定要将二进制的计算与存储原理搞清楚。