【问题标题】:Binary integer division in C?C中的二进制整数除法?
【发布时间】:2015-04-30 19:27:59
【问题描述】:

我正在查看 Wikipedia 中的 binary integer division with remainder 部分,想知道如何将其翻译成另一种语言,例如 C?

if D == 0 then error(DivisionByZeroException) end
Q := 0                 -- initialize quotient and remainder to zero
R := 0                     
for i = n-1...0 do     -- where n is number of bits in N
  R := R << 1          -- left-shift R by 1 bit
  R(0) := N(i)         -- set the least-significant bit of R equal to bit i of the numerator
  if R >= D then
    R := R - D
    Q(i) := 1
  end
end 

我知道如何翻译其中的大部分内容并进行位移,但是当它们是整数而不是函数或函数指针时,我该怎么做?抱歉这个基本问题,这个小部分让我感兴趣。

【问题讨论】:

标签: c binary division translate integer-division


【解决方案1】:

这是你的做法。

// R(0) := N(i)
R = (R & ~0x01) | ((N >> i) & 0x01);

第一部分清除 r 的 0 位,然后将它与 N 的第 i 位进行或运算,您已将其向下移动到 0 位的位置。如果 N(i) == 0,您必须先清除该位。

// Q(i) = 1
Q |= 0x01 << i;

在这种情况下,0x01 是单个位,然后您将其移到适当的位置。由于无论之前是什么,您都在设置该位,因此 OR 操作将起作用。

给出一些通用的二元运算:

如果你想要一点信息 X(n):

(X >> n) & 0x01;

如果要设置位为 1 以上。

如果要清位为0,X(n) = 0:

X &= ~(0x01 << n);

如果你想切换一点,X(n) = !X(n):

X ^= (0x01 << n);

如果你想给一个位分配一个二进制值,X(n) = y:

X = (X & ~(0x01 << n)) | (y << n);  // Assumes y = 0 or 1.

【讨论】:

  • 您甚至不需要清除第一行中的位,因为R 之前已在该行中向左移动。
  • 是的。但我必须添加上下文来描述这一点。所以我只是孤立地进行了手术。我做了一个简化的例子来说明那个细节,因为初学者经常会错过它。
猜你喜欢
  • 2020-12-11
  • 2017-08-22
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2016-08-22
  • 1970-01-01
相关资源
最近更新 更多