一、基本位运算
右移运算:按位右移,左补符号位
左移运算:按位左移,右补0位
针对某一位操作(此处1、0并非常数,而是对应需要变换的位置为1或0):
得到1:x|1;
得到0:x&0;
取反: x^1;
二、做题步骤
1.确定符号
2.确定数字
3.构造数字
eg:第k位由1变为0 x&(~(1<<(k-1)))
右数第k位取反 x^(1<<(k-1))
第k位由1变为0 x|(1<<(k-1))
取末k位 x&((1<<k)-1)
取右数第k位 (x>>(k-1))&1
三、求一个数的二进制表示中1的个数
int Bits(unsigned char ch) //无符号
{
int cout = 0;
/*while (ch != 0)
{
if ((ch & 1) == 1)
cout++;
ch >>= 1;
}*/
while (ch != 0)
{
ch = ch & (ch - 1);
cout++;
}
/* int bits[256] = { 0,1,1,2,1,2,2,3,1 };
return bits[ch];*/
return cout;
}
int main()
{
int x = 10;
printf("%d ", x & (x - 1)); //丢弃二进制右数第一个1
printf("%d ", Bits(10)); //-1
return 0;
}