首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

分享两道位操作笔试题!解决方法

2012-03-26 
分享两道位操作笔试题!1.判断正整数x是否为2的n次方C/C++ codeif(x(1n)) 或 if((x^(1n)0)2.给定一

分享两道位操作笔试题!
1.判断正整数x是否为2的n次方

C/C++ code
if(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

热点排行