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)”而已。非常感谢。我讨厌混乱。