首先需要知道位运算的基本操作:
a<<i 表示a进行了i次乘2,即a的二进制数向后加了i个0 1<<3==1*2*2*2==2^3==8 ==> (1000) 2==(8) 10
11<<1 ==22 ==> (11010)2==(22)10
a>>i 表示a进行了i次除2,即a的二进制数向右移了i位
11>>1 == 11/2==5 ==(101)2==(5)10
二进制枚举(1)
int a=11; for(int i=0;i<4;i++) printf("%d",a>>i&1); //数与1进行与操作,每次得到数末尾是1/0
1011 101 10 1
& 1 & 1 & 1 & 1
—————— ==》 ———— ==》 ———— ==》 ————
0001 001 01 1
得到的是1,1,0,1 即a二进制数的每个数,顺序相反,可以将其存入数组中
二进制枚举(2)
int n; for(int i=0;i<(1<<n);i++) //枚举2^n -1 种情况 printf("%d",i);
原文:https://www.cnblogs.com/Theo-sblogs/p/11605121.html