锐捷昨天的一道互联网C++笔试题,我的写法如下:
#define clear_bits(a,n) (a)&~(((1<<n)-1)<<(32-n))
注:1、n应该加上括号,上面括号比较多,再写上比较混乱,所以没给n写上括号,大家写的时候记得加上;另外,宏定义所有变量最好都加上括号。
2、(1<<n)-1就是2的n次方减1(当时我直接写的2^n-1,把异或^当成了次方运算,Faint!),即最低n位都置为1,例如(1<<4)-1即2的4次方-1,二进制表示为0000 1111
3、((1<<n)-1)<<(32-n)即把最低的n个1左移到最高的n个1,即最高n为都置为了1,eg,n=4时(以8位二进制为例),((1<<4)-1)<<(8-4),结果为1111 0000
4、然后对上面结果取反~,即最高的n位置为0,其他位全为1;最后a与这个数,即把a的最高n为清零了。