1. 程式人生 > >【銳捷筆試題】將整形變數a的最高n位清零,其它位不變,巨集定義:#define clear_bits(a,n)

【銳捷筆試題】將整形變數a的最高n位清零,其它位不變,巨集定義:#define clear_bits(a,n)

銳捷昨天的一道網際網路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為清零了。