java - 用右移编码整数
问题描述
好的,我有一个案例,我必须使用按位运算符对数字进行编码,然后对其进行解码
这就是我想出的对数字进行编码的方法
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 位来存储您的值。
如果该值为unsigned,则表示支持的范围为0..511。
如果该值是有符号的,则表示支持的范围是-256..255。
所以,如果你想允许像 350 这样的值,你的编码/解码必须是无符号的,这意味着你必须>>>
在解码时使用。
按原样,您不能同时支持 350和负值。如果你想要更大的值范围来支持它,你需要使用long
.
推荐阅读
- reactjs - 使用 react-beautiful-dnd 获取 DragHandle 错误
- javafx - 使用 FXCollections.observableArrayList() 从数据库中填充 treetableview
- c++ - Qt QString 快速处理问题
- java - Jackson 无法将空字符串值转换为枚举
- http - 尖括号在数据 URI 中有效吗?
- php - PHP,根据页面条件触发 cookie
- excel - Excel VBA 手动转置
- django - 如何在 django-ajax_select 字段中呈现默认值
- amazon-web-services - 使用 Winston 设置 AWS Cloudwatch
- anaconda - Python 3.6 USZIPCODE 安装