位运算
获取a的第b位:
int getbit(int a,int b) {return (a>>b)&1;}
将a的第b位设置为0:
int unsetbit(int a,int b) {return a&~(1<<b);}
将a的第b位设置为1:
int setbit(int a,int b) {return a|(1<<b);}
将a的第b位取反:
int flapbit(int a,int b) {return a^(1<<b);}
求二进制1的个数:
__builtin_popcount(x);
求二进制末尾0的个数:
__builtin_ctz(x);//如果x==0,则会UB
求二进制有几个前导0:
__builtin_clz(x);//如果x==0,则会UB