1

我有两组值。每个都在 -15 到 + 15 的范围内,包括 0。

我设法用 8 位表示两个数字。这些位中的 4 个可能属于负集,另外 4 个是正集。

每当我读取该位序列时,我都希望能够确定最初的 4 位是 + 还是 -。

有没有办法使用打包和解包的按位运算来完成这个?还是其他聪明的方法?

提前致谢。

更新:这里是我想要实现的一个示例:

在这 31 个值中,我只需要使用 8 位表示两个值,例如我有数字 14+ 和 15+。它们可以都是正面的,也可以各有一个,但它们不能都是负面的。所以 14 = 1110 和 15 = 1111(取出所有 0);bitsequence = 11101111 所以拆包时我知道字节239 = 11101111,实际上通过解析位序列分别代表数字14+和15+。但是,当任何一个数字为负时,我都很难过。

4

2 回答 2

4

您可以使用位域非常轻松地做到这一点:

struct two_numbers
{
     signed char first : 4;
     signed char second : 4;
};

然后你可以像往常一样与零进行比较:

two_numbers t = { 7, -5 };
if (t.first < 0 || t.second < 0) { ... }

但是请注意,4 位字段只允许从 -8 到 7 的值,而不是 -15 或 15。

于 2012-09-26T04:15:22.487 回答
0

假设您使用的是 8 位示例,其中使用高位表示负数,使用低位表示正数。如果你用 0xF0 屏蔽你的号码,结果非零,那么你的号码是负数。

解决问题的另一种方法是只使用您的语言为字节值提供的任何方法。然后,您不需要做任何聪明的事情,只需测试该值是否小于零。

于 2012-09-26T04:17:16.097 回答