第【1】章: 位运算的奇巧 学习报告
(1.1)节: 课程介绍
略
(1.2)节: 如何找出数组中唯一成对的那个数
1.题干:
2.解答思路:异或可以使相同项两两消除1^1=0,即把全部数用^连接,然后与1到1000^的结果再进行^。因为1-1000除了那个重复的出现3次,其他都出现两次,可以消除
3.关键代码:
int d=0;
for(int i=1;i<=1000;i++)
d=d^i; //1-1000的异或结果
for(int i=0;i<=1000;i++)
d=d^a[i]; //1-1001的结果与d进行异或
cout<<d<<endl;
(1.3)节: 找出落单的数
1.题干:
2.解答思路:将所有数和^运算符连接,结果就是落单的数
3.关键代码:
int b=0;
for(int i =0;i<n;i++)
b=b^a[i];
cout<<b;
(1.4)节: 一题三解:二进制中1的个数
1.题干:
2.解答思路:
方法一:利用1&1=1;1&0=0;将1不断<<右移与输入的值比较,进行计数;
方法二:利用1&1=1;1&0=0;将输入的值不断>>左移和1进行比较,进行计数;
方法三:采用削1法,将N-1后再与N做&运算,可消掉原N中一位1
3.关键代码:
方法一:
Int dd (int a)
{ int b=0;
for(int i=0;i<32;i++) //整形int为32位
If((1<<i)&a)
b++;
return b;////结果
}
方法二:
Int dd (int a)
{ int b=0;
for(int i=0;i<32;i++) //整形int为32位
If((a>>i)&1)
b++;
return b;////结果
}
方法三:
Int dd (int a)
{ Int count=0;
While(a!=0)//将a与a-1做&运算,然后运算结果再赋予a,当a不为0时不断循环
{
a=(a-1)&a;
count++;
}
return count;
}
(1.5)节: 判断一个数是否是2的整数次方
1, 题干:
2, 解答思路:利用销1法,判断一次销1后是否为0
3, 关键代码:if((a&(a-1))==0)return 1;
else return 0;
(1.6) 节: 位运算思维
1、 题干:将整数的奇偶位互换,即34位2进制奇偶互换如9=1001,变成6=0110
2、 解题思路:将该数与b=0b10101010101010101010101010101010用&位运算符保存奇数位,用&运算符与c=0b01010101010101010101010101010101保存偶数位。然后a左移b右移,用异或连接起来。
3、 关键代码
b=a&0b10101010101010101010101010101010;
c=a&0b01010101010101010101010101010101;
a=(b>>1)^(c<<1);
(1.7) 节: 挪2取整
1、题干:
2、解题思路:小数点后二进制的表示方法是用小数部分乘2,取整数部分后继续乘2直到小数点后为0
3、关键代码:
While(a!=0)
{
a=a*2;
if(a>=1)
{a=a-1;i++;cout<<1;}
If(a<1)
{cout<<0;i++}
If(i>32)
{Cout<<”error”;break;}
}