C中的二进制整数除法?

时间:2015-02-27 23:20:08

标签: c binary division translate integer-division

我正在查看维基百科中的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 

我知道如何翻译它的大部分并进行位移,但是当它们是整数而不是函数或函数指针时,我会怎样做R(0) = N(i)Q(i) = 1?对不起基本问题,小部分让我感兴趣。

1 个答案:

答案 0 :(得分: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以上。

如果要将某个位清零,则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.