使用右移对整数进行编码



好的,我有一个情况,我必须使用按位运算符对数字进行编码,然后对其进行解码

这就是我想出的对数字进行编码的方法

Random random = new Random(System.currentTimeMillis());
int lastInt = random.nextInt(24);
int howMany = 350;
int start = (lastInt & ~1337) | (howMany << lastInt);

我要编码的数字是350这在大多数情况下都很好用,我使用

start >> lastInt,如果数字是负数,例如以下情况:System.out.println(-1593835514 >> 23);,它不会打印正确的编码数字,我很确定这是因为第一个整数是负数,我可以使用>>>来移动无符号整数,但我不想那样做,我如何确保我所有编码的整数都通过>>

解码

由于您使用random.nextInt(24)作为移位值,这意味着移位值可以在 0..23 范围内。如果移位为 23,则在 32 位数字中只剩下 9 位来存储您的值。

如果该值无符号,则表示支持的范围为 0..511
如果该值是有符号的,则表示支持的范围为-256..255

因此,如果要允许像 350 这样的值,则编码/解码必须是无符号的,这意味着在解码时必须使用>>>

按原样,不能同时支持 350负值。如果您希望更大的值范围来支持这一点,则需要使用long

最新更新