C 表示两个'中的x所需的最小位数;补语

C 表示两个'中的x所需的最小位数;补语,c,binary,bit,twos-complement,C,Binary,Bit,Twos Complement,我在读一本书,书中有一个练习: /* 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 * howManyB

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

/* 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;
}
/*howManyBits-返回表示x所需的最小位数
*二元补码
*示例:多少比特(12)=5
*多少比特(0)=1
*多少比特(-1)=1
*多少比特(0x8000000)=32
*法律行动:!~&^ |+>
*最高运行时间:90
*评级:4
*/
整数多少比特(整数x){
返回0;
}

我甚至不明白问题本身,为什么12需要5位,不是1100吗,也就是4位?为什么-1只需要1位呢?1…1不是两个补码中的-1,所以需要32位吗?

一个位用来表示符号,
0
表示正,而
1
表示负数。例如,表示
+12
-12
所需的最小位数为五:

+12 = 0 1100
-12 = 1 0100

12点和-1点都可以通过记住这是2的补码来解决。该问题询问所需的最小位数

在2的补码值中,如果最高阶位是a
1
,则该值为负值

1位2的补码可以表示2个值,
-1
0
,位模式分别为
1b
0b

如果您查看2位值,会更清楚一些,它可以表示:

-2
10b

-1
11b

0
00b

1
01b

请注意,1位2的补码值
1b
并不表示
1
。类似地,
12
需要5位:
01100b
。4位
1100b
的值为
-4

为什么
12
需要5位,那不是
1100
,也就是4位吗

对于2的补码,需要多1位才能对值的有符号性进行分类。这(通常)是位模式的最左侧位,也称为“最高有效位”(MSB)。如果该有符号位为
1
则该值为负值,如果该位为
0
则该值为正值。因此,您需要5位来表示值
12
=
01100
,而不是4位

为什么
-1
只需要1位


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

您需要符号位,因此12不是
1100
,而是
01100
(否则它将是负数)。如果你只有一个位,那就是符号位,范围是从-1到0。它基本上告诉你正数必须以零开始,所以
-1
应该表示为
1
,而
1
应该表示为
01
二进制。“正号(1)”令人困惑。也许只是“当符号位设置为(1)”而已。非常感谢。我讨厌混乱。