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