首页 > 解决方案 > 用右移编码整数

问题描述

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

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

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);,它不会打印正确的编码数字,我很确定这是因为第一个整数是负数,我可以用它>>>来移动无符号整数,但我没有'不想那样做,我怎样才能确保我所有的编码整数都通过解码>>

标签: javabit-manipulation

解决方案


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

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

所以,如果你想允许像 350 这样的值,你的编码/解码必须是无符号的,这意味着你必须>>>在解码时使用。

按原样,您不能同时支持 350负值。如果你想要更大的值范围来支持它,你需要使用long.


推荐阅读