版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013564742/article/details/84978060
今天在对下位机发送指令的时候,由于下位机是根据byte里面的某一位值来确定某个功能是否需要开启/关闭的,因此控制下位机需要在改变某一位值的同时保留其他值不变。
这里以改变第2位值为例。
刚开始时头脑比较蒙,首先想到用int数组来保存对应byte的值,然后改变后对下的下标值来达到效果。如2,那么int数组为[0,0,0,0,0,0,1,0]。如果要关闭,则把第2位值变为0,即[0,0,0,0,0,0,0,0]。换算成数据就是0。
获取int值每一位值可以参考以下代码实现:
/** 获取16进制值的每一位值
* @param hexValue (必须保证为2个字节长度的String,否则得不到值)
* @return 返回长度为8的字节数组,每个值代表每一位的值
*/
private static byte[] getEachByteValue(String hexValue) {
if (hexValue.length() != 2){
return null;
}
byte bValue = (byte)Integer.parseInt(hexValue,16);
byte[] array = new byte[8];
for(int i = 7; i >= 0; i--){
array[i] = (byte)(bValue & 1);
bValue = (byte)(bValue >> 1);
}
return array;
}
之后再根据数组算出最后的值就可以了。如[0,0,0,0,0,0,1,0]就是0 x 1+1 x 2+0 x 4+0 x 8……
后来总觉得不妥,喝了杯咖啡后豁然开朗(咖啡厂商自觉打钱),可以用与或运算来解决,如果需要把某位0变为1,那么只需进行或运算就可以了,这样其他位也不会受到影响。如:
00000000 |("或"运算) 00000010 = 00000010 这样就完成置位了.
如果把某位从1变为0,则与运算, 如:
00000010 &("与"运算) 11111101 = 00000000
这样换成代码就是 a | 0x02 和 a & 0xFC,瞬间代码简短很多且运行效率提高。