例如,假设我已经将三个10位带符号整数包装到Java整数中。
我可以轻松提取10位:
int unpacked = packed & 0x3FF;
packed >>= 10;
etc ...
但是现在我需要对最高位(右边的第9位)进行符号扩展。有没有一种快速的方法可以通过测试最高位和设置来做到这一点?
也许有一种更好的拆包方法可以将标牌留在原处。
答案 0 :(得分:4)
int signed = (packed << (32 - 10)) >> (32 - 10);
因为>>>
是无符号的右移,而>>
是有符号的右移。
(我仍然有“ bug”,谢谢@rghome)
答案 1 :(得分:4)
移位两次的另一种方法是翻转符号然后将其减去:
int unpacked = packed & 0x3FF;
int extended = (unpacked ^ 0x200) - 0x200;
如果未设置符号,则将其翻转将其设置,然后减去则将其重置。
如果设置了符号,则将其翻转将其重置,减去该符号将再次设置它,但也将一直借用到顶部,一路设置所有位。
这有一些优点,
unpacked
和extended
为long
,那么同样的事情也会起作用。extended
添加一些常量,则可以将该加法和“减去符号”步骤合并为一个操作。