分享两道位操作笔试题!解决方法
分享两道位操作笔试题!1.判断正整数x是否为2的n次方C/C++ codeif(x(1n)) 或 if((x^(1n)0)2.给定一
分享两道位操作笔试题!
1.判断正整数x是否为2的n次方
C/C++ codeif(x==(1<<n)) 或 if((x^(1<<n)==0)
2.给定一个二进制表示的数x,以右为基准,对第p位开始的n个位进行反转(p从0开始)
例如:01101 0001 ,对p=4,n=3,反转后为01010 0001
写一个函数完成该操作
我的思路如下:
1.构造一个对应的数,与x进行异或操作,将指定的几位反转
2.有思路就容易下手了,于是有
((2^(n-1)+...+2^0)<<p)^x,不过效率就。。。(哥哥呀,先管管肚子吧)
3.吃饭时想何必那么麻烦,2^n-1不就行了(2^0...2^(n-1),2^n指求2的指数,其余^为异或操作)
4.考虑了一下,再修改修改!于是有
C/C++ code(((1<<n)-1)<<p)^x;
5.后来看着相减,心想,再修改修改。
于是最终结果为
C/C++ code(((-1<<n)^-1)<<p)^x;
嘿嘿,这下该满意了吧
[解决办法]-1在右移时是未定义的..所以移位时习惯用0xff