1

我是一名学生,我正在用 C 语言编写一个函数来对给定的位域进行符号扩展。我正在使用 32 位。

我在谷歌上查找了这个答案,但没有找到我要找的东西。

我正在编写一个函数,它返回从 32 个整数中提取的一个或多个连续位的二进制补码表示。最左边的位是符号位。

如果我拉一点点,我会返回什么?您如何将单个位表示为带符号的二进制补码数?

4

2 回答 2

1

据我了解,您想从 32 位变量中的位流中提取 N 个任意位(N >= 1 & <=32),并将它们表示为 2 的补数(大概将该数字作为有符号 int 32 返回)。

这就是说,您获取选定的位,将它们放在工作变量的低位(即右)端,然后通过向左传播(复制)剩余的位来“扩展”最左侧的选定位工作变量中的(以前未定义)位。这可以作为一个单一的一致算法来完成,不需要对 N 的任何特定值进行特殊处理。

对于两个位,它将产生可能的值 1、0、-1 和 -2(分别用于位模式 01、00、11 和 10)。对于一位,它将产生可能的值 0 和 -1(分别用于位模式 0 和 1)。

于 2012-09-03T01:25:05.780 回答
0

谈论 1 位二进制补码数没有多大意义。如果您只有 1 位,则为 0 或 1。

一般来说,如果你有一个 N 位的二进制补码数,可表示的最大值是2^(N-1)-1,最小值是-2^(N-1)。如果我们想傻,我们可以将它应用于 N=1,我们发现 1 位二进制补码的范围可以从 -1 到 0。

编辑: 您写道:

我正在编写一个函数,它返回从 32 个整数中提取的一个或多个连续位的二进制补码表示。最左边的位是符号位。

我不认为这是很好定义的。 二进制补码是一种编码,可让您将数学整数表示为一系列位。给定一个整数,它会告诉您要存储哪些位。我不知道一系列位的二进制补码表示是什么。这就像你要我给你一系列任意字节的 ASCII 编码,或者你要我把葛底斯堡地址从法语翻译成英语。

于 2012-09-03T01:07:51.590 回答