取位不是字符串从左往右,而是从右往左
效果:
二进制值: 10001100110
截取:第6位 长度4 = 10001 1001 10 = 1001
用java实现的哈,其他语言应该也差不多;
/**
* 截取二进制值
*
* @param binary 二进制值
* @param offset 截取起始位
* @param quantity 长度
* @return 值
*/
public static int subBinary(int binary, int offset, int quantity) {
// 公式: ((value & ((1 << offset) - 1))) >> (offset - quantity))
// 获取一个【截取起始位】长度的 【1】二进制值
// 例子: 1<<4 = 10000 -1 = 1111;
int offsetBinary = (1 << offset) - 1;
// 获取需要截取的部分 &:同位都是1=1,1&1 = 1 、1&0=0;。使用 & 符号配合offsetBinary 就可以获取出offset长度的值
// 例子: 10110110 & 1111 = 0110
int res = binary & offsetBinary;
// 使用 >> 去掉超过长度的值
// 例子:quantity = 1 取出一个
// 0110 >> (4 - 1) = 0
return res >> (offset - quantity);
}
用到的二进制运算符,可以去百度了解一下。
这种代码有什么应用场景呢,我是用在设备对接时返回的开关类数据用一串二进制统一返回了。某某开关值就是对应的那个二进制下标值