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

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

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

【问题讨论】:

    标签: binary integer-division


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-03-15
      • 2018-08-08
      • 2012-07-26
      • 1970-01-01
      • 2017-01-16
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多