位运算

神奇的位运算

 1 #include<cstdio>
 2  
 3 int turnten(int n)//二进制转十进制
 4 {
 5     return n==1?1:turnten(n/10)%10*2+n%10;
 6 }
 7 int turntwo(int n)//十进制转二进制 
 8 {
 9     return n==1?1:turntwo(n/2)*10+(n&1);
10 }
11 int main()
12 {
13     int n=10010;
14     int m=turnten(n); 
15     printf("%d
",m);//18,注意以下操作要使用m去位运算,且都是从第0位算起的 
16     
17     //(n>>k)&1操作 
18     for(int i=0;i<5;i++)//取出二进制的第i位
19         printf("%d ",(m>>i)&1);//0 1 0 0 1
20     
21     //n&((1<<k)-1)操作 
22     printf("
%d
",turntwo(m&((1<<3)-1))); //取出后三位,即010
23     
24     //n^(1<<k)操作 
25     printf("%d
",turntwo(m^(1<<2)));//将第2位取反,即变成10110
26     
27     //n|(1<<k)操作 
28     printf("%d
",turntwo(m|(1<<3)));//将第3位赋值为1,即11010
29     
30     //n&(~(1<<k))操作
31     printf("%d
",turntwo(m&(~(1<<1))));//将第1位赋值为0,即10000
32     
33     //n&(~n+1)操作
34     printf("%d
",turntwo(m&(~m+1)));
35     //lowbit运算,取出非负整数m在二进制表示下最低位的1以及它后面的0构成的数的值,此处会输出:10
36     
37     //求解第几位有数字1
38     int h[1<<4];
39     for(int i=0;i<=4;i++)
40         h[1<<i]=i;//初始化标注若有1则它该出现在哪儿
41     while(m>0)
42     {
43         printf("%d ",h[m&-m]);
44         m -= m&-m;
45         //m&-m操作,等同于m&(~m+1),此处会输出1 4 
46     } 
47      
48     return 0;
49 }
原文地址:https://www.cnblogs.com/1013star/p/9479888.html