我是学生,我正在用C编写一个函数来签名扩展给定的位字段。我正在使用32位。
我在谷歌上看了这个答案,但没找到我要找的东西。
我正在编写函数,它返回从32 int中提取的一个或多个连续位的二进制补码表示。最左边的位是符号位。
如果我拉一下,我该怎么回事?你如何将一个比特代表一个有符号的二元竞争数?
答案 0 :(得分:0)
说一个1位二进制补码没有多大意义。如果您只有1位,则为0或1。
通常,如果您有一个带N位的二进制补码,则可表示的最高值为2^(N-1)-1
,最低值为-2^(N-1)
。如果我们想要愚蠢,我们可以将它应用于N = 1,我们发现1位二进制补码数的范围可以从-1到0。
编辑:您写道:
我正在编写函数,它返回从32 int中提取的一个或多个连续位的二进制补码表示。最左边的位是符号位。
我认为这个定义不明确。 二进制补码是一种编码,可以将数学整数表示为一系列位。给定一个整数,它会告诉您要存储的位数。我不知道一系列比特的两个补码表示是什么。这就像你要我给你一系列任意字节的ASCII编码,或者你要我把葛底斯堡地址从法语翻译成英语。
答案 1 :(得分:0)
据我了解,你想从32位变量的比特流中提取N个任意位(N> = 1&< = 32),并将它们表示为2的补码数(可能将该数字作为有符号的int 32返回)。
这就是说你取选择的位,将它们放在工作变量的低位(即右边),然后"扩展"通过向左传播(复制)工作变量中剩余的(先前未定义的)位来选择最左边的位。这可以作为单个一致的算法来完成,不需要特殊情况下任何特定的N值。
对于两位,它将产生可能的值1,0,-1和-2(分别用于位模式01,00,11和10)。对于一位,它将产生可能的值0和-1(分别对于位模式0和1)。