如何使用按位运算符查找余数?

时间:2018-10-28 18:35:37

标签: bitwise-operators

让我们看下面的代码。

int x = 5>>1;

它的作用是,将给定值除以2的1的幂(即2),然后返回商。在按位运算期间是否有可能得到余数?

1 个答案:

答案 0 :(得分:1)

按位移位返回一个值,因此“丢失”任何余数。

对于2的幂,可以将其与位掩码配对,以计算先前应用的移位中的“丢失的内容”。

int quotient = 5 >> 1;
int remainder = 5 & 0x01;

上面的掩码值可以用以下公式计算:~((~(int)0) < 1);对于32位整数~0 == 0xFFFF0xFFFF << 1 == 0xFFFE~0xFFFE == 0x01

因此,用变量替换:

int n = ..;
int z = ..;
int quotient = n >> z;
int remainder = n & ~((~(int)0) << z);

同样,在更一般的情况下,整数除法(/)与取模运算符(%)配对。每个运算符仅返回一个值。

int n = ..;
int z = ..;
int p = 1 << z;
int quotient = n / p;
int remainder = n % p;