int howManyBits(int x) {
int concatenate;
int bias;
int sign = x >> 31; //get the sign
x = (sign & (~x)) | (~sign & x);
concatenate = (!!(x >> 16)) << 4;
concatenate |= (!!(x >> (concatenate + 8))) << 3;
concatenate |= (!!(x >> (concatenate + 4))) << 2;
concatenate |= (!!(x >> (concatenate + 2))) << 1;
concatenate |= x >> (concatenate + 1);
bias = !(x^0);
return concatenate + 2 + (~bias + 1);
}
此代碼被呈現作爲一種方法來計算代表以2的補的整數n
所需的比特的最小數量,並假設該int
數據類型用32位表示。假設右移是算術運算。任何人都可以解釋這種按位函數來計算的log(n)
據我所知,基本的方法是取n
的日誌庫2,四捨五入,然後添加1位來說明符號位。
我也明白,左移等同於2和向右移位等同於2
如此說來劃分倍增,沒有意見,我不能破譯這個代碼是做超越它獲得符號位的值的部分。我通過鉛筆和紙上的樣品int
的值爲5 - 代碼工作,但我不明白爲什麼。
有人可以提供一些直觀的代碼是幹什麼的細分?