第【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;}

}

 

posted @ 2019-12-03 20:23  浪波激泥  阅读(180)  评论(0编辑  收藏  举报