我正在查看维基百科中的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
?对不起基本问题,小部分让我感兴趣。
答案 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.