📜  关闭最右边的设置位|套装2(1)

📅  最后修改于: 2023-12-03 14:50:05.986000             🧑  作者: Mango

关闭最右边的设置位|套装2

简介

在编程中,我们经常需要处理二进制数,其中每一位都代表着一个状态或者开关。当我们需要关闭二进制数中最右边的设置位时,可以使用位运算中的与运算(&)和减一运算(-1)来实现,这也被称为清除最低位。而当我们遇到多个二进制数都需要进行这样的操作时,我们可以将其制作成一个套装(类),方便我们的调用和修改。

本篇文章将介绍如何制作一个套装2,其中包含清除最低位的功能。

代码实现
类的定义
class BitSuit2:
    def __init__(self, *args):
        self.bits = list(args)

这里我们使用了可变参数,方便用户输入不同位数的二进制数。

清除最低位

方法1:与运算

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)。

方法2:减一运算

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的全部代码实现,通过将其封装成一个类,我们可以非常方便地调用和维护。