BITFIELD key 的子命令
- GET
<type>
<offset> - 返回指定位置的域
<type> - u/i 无符号/带符号
<offset> - 偏移量
BITFIELD GET 会把对应的字节码转为Long值返回,使用带符号和无符号返回的Long值可能不同
写一个打印long值补码的程序
static public List<Integer> longToBitMap(long l) {
List<Integer> list = new ArrayList<>();
long longNum = l;
while(longNum != 0) {
long l1 = longNum & 1;
list.add((int) l1);
longNum >>>= 1;
}
// 不足64位 前面补零
for (int i = list.size(); i < 64; i++) {
list.add(0);
}
Collections.reverse(list);
return list;
}
往redis Bitmap中写入数据
分别用无符号和有符号获取8个bit位的值,因为第一位为0,得到结果都是3
long l = 3L 的64位补码为
将bm1的第一位设置为1,再获取值得到131和-125
再看看这两个值的补码
可以判断无符号和有符号取值大致如下
总结:
无符号取值:取到的bit位填入long补码的右侧,相当于直接转为long值(无符号取值最大63位,所以不可能取到负数)
带符号取值:取到的第一位设置位符号位,剩下的bit位填入long补码的右侧,再根据符号位不同,高位补0或1(带符号取值最大64位)