首页 > 试题广场 >

x为整型,请用位运算实现x%8。

[填空题]
x为整型,用位运算实现x%8的表达式是   1
 x&0x7也算错?

发表于 2017-02-14 19:09:43 回复(0)
更多回答
推荐
当我们求余的时候,相当于除以2的N次冥,也就是相当于把数本身右移N位,但是右移掉的那些位需要通过位运算进行保留;用以上例子来说,X%8即X%2^3,那么就需要右移三次,那么移去的三位需要保留下来,而8=1000,刚好,可以使用0111来保留下来后三位,于是,对于除数都是2的整数次幂的情况,可以使用x & (2^n-1)的方法进行与运算,保留下来的最末尾的n位就是余数。
该题中,结果为x&7.
编辑于 2015-02-03 17:12:06 回复(4)
对于2的整数次幂的数,可以让该数按位取反后得到的数,再进行&运算。
本题中8为1000,按位取反后为0111,也就是整数7,所以结果为:x &7
发表于 2016-06-17 16:00:53 回复(1)
取模运算转化成位运算 (在不产生溢出的情况下):
a % (2^n) 等价于 a & (2^n - 1)
参考资料:http://blog.csdn.net/black_ox/article/details/46411997
发表于 2016-08-08 16:08:07 回复(0)
(1) 取模运算转化成位运算 (在不产生溢出的情况下)
         a % (2^n) 等价于 a & (2^n - 1)
(2)乘法运算转化成位运算 (在不产生溢出的情况下)
         a * (2^n) 等价于 a<< n
(3)除法运算转化成位运算 (在不产生溢出的情况下)
         a / (2^n) 等价于 a>> n
        例: 12/8 == 12>>3
(4) a % 2 等价于 a & 1       
(5) if (x == a) x= b;
          else x= a;
      等价于 x= a ^ b ^ x;
(6) x 的 相反数 表示为 (~x+1)

发表于 2017-06-02 11:45:56 回复(0)
我去,x&0x7也算错
发表于 2016-09-12 20:43:37 回复(0)
(x<<28)>>28

发表于 2018-07-02 16:33:59 回复(0)
答案是:x&7,通过分析我们可以知道x%8是等于:x-(x>>3),从中我可以知道x%8就是保留了x的二进制数的最后三位,所以可以直接通过:x&7实现。
发表于 2017-05-08 15:37:25 回复(0)
考虑到x为负数的情况:
 (x>0) ? (x&7) : -(abs(x) & 7);

发表于 2016-11-14 19:36:08 回复(0)
位运算实现求模%(针对除数是2^n即2的整数次幂且被除数为正整数时):
x % (2^n)  等价于  x & (2^n - 1)
如:x % 8 等价于 x & 7
发表于 2016-08-29 16:45:20 回复(0)

#include <stdio.h>

int main()
{
 int i = 80;
 printf ("%d/8 = %d\n",i,i/8);
 printf ("%d/8 = %d\n",i,i>>3);

i=83;
 printf ("%d%8 = %d\n",i,i%8);
 printf ("%d%8 = %d\n",i,i&7);//跟7相与。

}
刚开始没有想通,  看了这个博文就明白了。:
http://blog.csdn.net/gothicane/article/details/3839180
发表于 2014-12-11 12:42:27 回复(0)
既然X是整型,就可正可负,负数的时候x&7的结果就不对了,求解答
发表于 2015-08-29 19:36:41 回复(5)
各位大神,我的答案是x^8,不知道这样为什么不对
发表于 2017-07-17 15:29:11 回复(0)
x&0x7也不对的咯。。
发表于 2017-03-30 14:26:57 回复(0)
 ((x>>3)<<3)^x也可以,x / 8 * 8 +余数=x;
发表于 2016-08-31 22:19:37 回复(0)
x&00000111
发表于 2016-07-20 16:51:09 回复(0)
 ((x < 0) ? (-((-x) & 7)) : (x & 7))
发表于 2016-05-02 14:13:12 回复(0)
右移求除,与2^(n-1)就是求余了
发表于 2016-03-04 13:44:22 回复(0)
写对了却给批错了 什么鬼
发表于 2015-10-26 16:09:33 回复(0)
使用移位运算符也是可以的嘛x<<28)>>28,而且完美解决x为负数的情况
发表于 2015-10-07 11:46:11 回复(2)
x&7:
对8取余,1000(2),这就是要保留后面三为,所以用全1保留,所以是x&7
发表于 2015-09-19 16:44:19 回复(0)