位运算
神奇的位运算
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\n",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("\n%d\n",turntwo(m&((1<<3)-1))); //取出后三位,即010
23
24 //n^(1<<k)操作
25 printf("%d\n",turntwo(m^(1<<2)));//将第2位取反,即变成10110
26
27 //n|(1<<k)操作
28 printf("%d\n",turntwo(m|(1<<3)));//将第3位赋值为1,即11010
29
30 //n&(~(1<<k))操作
31 printf("%d\n",turntwo(m&(~(1<<1))));//将第1位赋值为0,即10000
32
33 //n&(~n+1)操作
34 printf("%d\n",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 }