问题描述
业务使用中会将redis bitmap中的一些位设置为1(数量和offset是随机的,offset <= 1000万)。
读取的时候需要通过整取的方式判断哪些offset为1(不仅仅是数量,还有具体的offset)。代码如下
相关代码
RedisUtil.setbit("bit:test", 0L, true);
RedisUtil.setbit("bit:test", 1L, true);
RedisUtil.setbit("bit:test", 7L, true);
String value = RedisUtil.get("bit:test");
byte[] bytes = value.getBytes();
for(byte b: bytes) {
System.out.println(Integer.toBinaryString(b));
}
你期待的结果是什么?实际看到的错误信息又是什么?
这个时候会发现打印的结果为
1111 1111 1111 1111 1111 1111 1110 1111
1111 1111 1111 1111 1111 1111 1011 1111
1111 1111 1111 1111 1111 1111 1011 1101
而期待的结果应该是
1100 0001
由于Java使用二进制补码表示,当bit位0,8,16这种处于一个字节开头的位设置为0的时候,就会出现这种问题(PS. 网上我找到的关于零存整取的例子都“巧妙”的避开了这种情况)
所以怎样才能转换为期待的结果1100 0001
。
用
get(byte[])
,get(String)
不能正常取值另外这个场景感觉用
hash
可能更容易实现一些