让我们看下面的代码。
int x = 5>>1;
它的作用是,将给定值除以2的1的幂(即2),然后返回商。在按位运算期间是否有可能得到余数?
答案 0 :(得分:1)
按位移位返回一个值,因此“丢失”任何余数。
对于2的幂,可以将其与位掩码配对,以计算先前应用的移位中的“丢失的内容”。
int quotient = 5 >> 1;
int remainder = 5 & 0x01;
上面的掩码值可以用以下公式计算:~((~(int)0) < 1)
;对于32位整数~0 == 0xFFFF
,0xFFFF << 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;