📅  最后修改于: 2023-12-03 14:50:05.986000             🧑  作者: Mango
在编程中,我们经常需要处理二进制数,其中每一位都代表着一个状态或者开关。当我们需要关闭二进制数中最右边的设置位时,可以使用位运算中的与运算(&)和减一运算(-1)来实现,这也被称为清除最低位。而当我们遇到多个二进制数都需要进行这样的操作时,我们可以将其制作成一个套装(类),方便我们的调用和修改。
本篇文章将介绍如何制作一个套装2,其中包含清除最低位的功能。
class BitSuit2:
def __init__(self, *args):
self.bits = list(args)
这里我们使用了可变参数,方便用户输入不同位数的二进制数。
def clear_lowest1(self):
for i in range(len(self.bits)):
self.bits[i] &= (self.bits[i] - 1)
这里使用了一个特殊的性质:
假设 a 的二进制表示中最右边的 1 在第 k 位(如 a = 11,二进制表示为 1011,那么 k = 1),
则 a - 1 的二进制表示为:最右边的 1 变成了 0,最右边的 1 右边的 0 全部变成了 1,
其余位保持不变,也就是说,a - 1 = 10...010...0(k - 1 个 1)。
那么,a & (a - 1) 的结果就是:最右边的 1 以及它右边的所有位都变为 0,其他位保持不变。
例如:a = 11(1011),a - 1 = 10(1010),a & (a - 1) = 8(1000)。
def clear_lowest2(self):
for i in range(len(self.bits)):
self.bits[i] -= (self.bits[i] & -self.bits[i])
这里使用了另一个特殊的性质:
将一个数减去 1,则其最右边的 1 变成 0,其右边的 0 全部变成 1,其余位保持不变。
例如:11 - 1 = 10(1010),10 - 1 = 9(1001)。
然后将原数与减一的结果进行与运算,就可以将最右边的 1 清零。
例如:11 & 10 = 10(1010),10 & 9 = 8(1000)。
以上便是制作清除最低位的套装2的全部代码实现,通过将其封装成一个类,我们可以非常方便地调用和维护。