如何使用二进制运算将整数除以 3

Posted

技术标签:

【中文标题】如何使用二进制运算将整数除以 3【英文标题】:How to divide an integer by 3 using binary operations 【发布时间】:2020-08-05 06:51:52 【问题描述】:

类似问题:How to know if a binary number divides by 3?

但是如何仅使用二进制运算有效地将一个数字除以 3?

【问题讨论】:

【参考方案1】:

主要思想是以下观察:

1/3 = 1/4 + 1/16 + 1/64 + ... 

我们记住,除以 4 是一个简单的二进制运算(两个位移位)。 现在,由于我们正在处理整数,它可能不能被 4 的幂整除,我们必须进行适当的修改。令 x_0 为可被 3 整除的整数。我们有:

x_0 = 4*q_0 + r_0

其中 q_0 = x_0 // 4 和 r_0 = x_0 % 4,或者换句话说,

q_0 = x_0 >> 2, r_0 = x_0 & 3

对于这个 q_0,我们有

x_0 - 3*q_0 = q_0 + r_0 

我们将 q_0 加到一个累加和中,现在我们要除以 x_1 := q_0 + r_0,我们知道它可以被 3 整除,并且比 x_0 小(大约 2 位)。在 x_k > 3 时迭代这个想法,诱导序列

q_0 + q_1 + ... + q_k 

加起来就是想要的结果,x_0 / 3。

至于运算,我们有:位移、AND 和加法。使用 AND 和 XOR 可以通过二进制操作简单地实现加法。这是一些代码:

def binary_sum(a, b):
    
    while True:
        
        add = a ^ b         # '^' is XOR
        carry = a & b
        if carry == 0:
            break
        else:
            a = add
            b = carry << 1
    
    return add
        


def bin_division_by_3(x):
     
    sum = 1

    while x > 3:
        q, r = x >> 2, x & 3
        sum = binary_sum(sum, q)
        x = binary_sum(q, r)

    return sum

【讨论】:

以上是关于如何使用二进制运算将整数除以 3的主要内容,如果未能解决你的问题,请参考以下文章

编写C程序,如何利用位运算,保留整数a二进制从右边开始的第3位至第6位?

二进制运算-十进制与二进制的转换

运算符与表达式

java运算符

二进制中1的个数

二进制运算使用