【发布时间】:2015-06-22 07:40:20
【问题描述】:
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 位表示。假设右移是算术的。
我知道基本的方法是取n的log base 2,四舍五入,然后加上1位来占符号位。
我也明白左移相当于乘以 2,右移相当于除以 2。
话虽如此,如果没有 cmets,除了获取符号位值的部分之外,我无法破译这段代码在做什么。我在铅笔和纸上用一个值为 5 的样本 int 完成了它 - 代码有效,但我不明白为什么。
有人可以提供一些代码在做什么的直观细分吗?
【问题讨论】:
标签: c logic bitwise-operators