二进制枚举法 位运算

首先需要知道位运算的基本操作:

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);

 

 

猜你喜欢

转载自www.cnblogs.com/Theo-sblogs/p/11605121.html