首页 > 解决方案 > 在二进制补码中表示 x 所需的最小位数

问题描述

我正在读一本书,其中有一个练习:

/* howManyBits - return the minimum number of bits required to represent x in
 *             two's complement
 *  Examples: howManyBits(12) = 5
 *            howManyBits(0)  = 1
 *            howManyBits(-1) = 1
 *            howManyBits(0x80000000) = 32
 *  Legal ops: ! ~ & ^ | + << >>
 *  Max ops: 90
 *  Rating: 4
 */

int howManyBits(int x) {
    return 0;
}

我什至不明白这个问题本身,为什么 12 需要 5 位,那不是 1100,即 4 位吗?为什么 -1 只需要 1 位?那不是 1...1 在二进制补码中是 -1,所以需要 32 位?

标签: cbinarybittwos-complement

解决方案


为什么12需要 5 位,不是11004 位吗?

使用二进制补码,需要多 1 位来对值的符号进行分类。这(通常)是位模式的最左边位,也称为“最高有效位”(MSB)。如果这个有符号位是1负值,如果0是正值。所以你需要 5 位来表示值12= 01100,而不是 4。

为什么-1只需要1位?

当您只有 1 位时,该位也用于值的符号,可以表示值0-1; -1而不是1因为有符号位设置为1表示负值。


推荐阅读