1

我正在处理一些二进制数,试图连接数字。在这种情况下,我会得到我想要的:

  num = 0;
  num = (num<<3)|4;
  num = (num<<9)|7;

如果我格式化为 4 个十六进制数字,这会将 num 设置为 100000000111 或 0x0807。

但是,如果我尝试连接一个负数:

  num = 0;
  num = (num<<3)|4;
  num = (num<<9)|-7;

当我想得到 0x09F9 时,我得到 0xFFF9。右边的 9 位似乎是正确的,但左边的一些位似乎被翻转了。我猜当我执行逻辑或负数时,符号位被移动到最左边的位或其他东西。有什么办法可以防止这种情况发生吗?

另外,我知道在我的示例中,我可以将 num 设置为数字而不进行移位,但在我的实际程序中,这些是变量,我只是对数字进行硬编码以进行演示。

4

1 回答 1

3

-7可能是一个 32 位负数 - 即0xfffffff9. 如果您只想使用 9 位,则需要对其进行屏蔽:

num = (num << 9) | (-7 & 0x1ff)
于 2013-02-01T19:58:34.970 回答