java改变byte的某一位值

版权声明:本文为博主原创文章,未经博主允许不得转载。 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,瞬间代码简短很多且运行效率提高。

猜你喜欢

转载自blog.csdn.net/u013564742/article/details/84978060
今日推荐