• 如何获取byte的各个bit值以及常见位操作


    项目中通过信号采集板的数据获取车上仪表盘指示灯的信息,将接收到的数据转成byte后,还要将每一个Byte的各个Bit值分离出来,这样才知道每个bit的值代表的具体信息。这里记录下如何获取byte的各个bit值,一些常见的位操作也顺便记录下。

    1、分离出一个Byte的各个Bit的值

    一个英文字符占一个字节(1字母=1 byte=8 bit),一个汉字占两个字节(1汉字=2 byte=16 bit)。

    其中,bit: 位,一个二进制数据0或1,是1bit。

         byte:字节,存储空间的基本计量单位,1 byte=8 bit。

    byte:1个字节(8位) (-128~127)  (-2^7~2^7-1)

    short:2个字节(16位) (-32768~32767)  (-2^15~2^15-1)

    int:4个字节(32位) (-2147483648~2147483647)  (-2^31~2^31-1)

    long:8个字节(64位) (9223372036854774808~9223372036854774807)  (-2^63~2^63-1)

    float:4个字节(32位) (3.402823e+38~1.401298e-45)  (e+是乘以10的38次方,e-45是乘以10 的负45次方)

    double:8个字节(64位) (1.797693e~4.9000000e-324)

    (1)byte-->bit

    public class T {  
        /** 
         * 将byte转换为一个长度为8的byte数组,数组每个值代表bit 
         */  
        public static byte[] getBooleanArray(byte b) {  
            byte[] array = new byte[8];  
            for (int i = 7; i >= 0; i--) {  
                array[i] = (byte)(b & 1);  
                b = (byte) (b >> 1);  
            }  
            return array;  
        }  
        /** 
         * 把byte转为字符串的bit 
         */  
        public static String byteToBit(byte b) {  
            return ""  
                    + (byte) ((b >> 7) & 0x1) + (byte) ((b >> 6) & 0x1)  
                    + (byte) ((b >> 5) & 0x1) + (byte) ((b >> 4) & 0x1)  
                    + (byte) ((b >> 3) & 0x1) + (byte) ((b >> 2) & 0x1)  
                    + (byte) ((b >> 1) & 0x1) + (byte) ((b >> 0) & 0x1);  
        }  
        public static void main(String[] args) {  
            byte b = 0x35; // 0011 0101  
            // 输出 [0, 0, 1, 1, 0, 1, 0, 1]  
            System.out.println(Arrays.toString(getBooleanArray(b)));  
            // 输出 00110101  
            System.out.println(byteToBit(b));  
            // JDK自带的方法,会忽略前面的 0  
            System.out.println(Integer.toBinaryString(0x35));  
        }  
    }

    (2)bit-->byte

    /** 
     * 二进制字符串转byte 
     */  
    public static byte decodeBinaryString(String byteStr) {  
        int re, len;  
        if (null == byteStr) {  
            return 0;  
        }  
        len = byteStr.length();  
        if (len != 4 && len != 8) {  
            return 0;  
        }  
        if (len == 8) {// 8 bit处理  
            if (byteStr.charAt(0) == '0') {// 正数  
                re = Integer.parseInt(byteStr, 2);  
            } else {// 负数  
                re = Integer.parseInt(byteStr, 2) - 256;  
            }  
        } else {// 4 bit处理  
            re = Integer.parseInt(byteStr, 2);  
        }  
        return (byte) re;  
    } 

    2、左移和右移

    直接举例说明:

    (1)左移:3左移2

      |0000 0000  0000 0000  0000 0000  0000 0011

      00|0000 0000  0000 0000  0000 0000  0000 1100   空位补0

    3<<1=6;3<<2=12;3<<3=24;

    由此可看出一个规律:

    3x2^1=6;3x2^2=12;3x2^3=24;

    (2)右移:6右移2位

            0000 0000  0000 0000  0000 0000  0000 0110|

            0000 0000  0000 0000  0000 0000  0000 0001|10  

    空位补0(看最高位,这里最高位为0),负数最高位为1,补1。

    总结:<<左移:就是乘以2的移动的位数次幂。

        >>右移:就是除以2的移动的位数次幂。

        >>:最高位补什么由原有数据的最高位值而定,补0或1。

        >>>无符号右移:无论最高位是什么,右移后都补0。

    3、与(&)、或(|)、异或(^)

    直接举例说明:

    (1)6&3=2;

       110             1代表真,0代表假

      & 011   

         010=2

    (2)6|5=7;

         110

        |   101   

            111=7

    (3) 6^5=3;

          110

         ^   101    

              011=3

        再举一个例子: 7^4^4=7;  (一个数异或同一个数两次,结果还是那个数,可以用来数据加密)

           111

         ^   100    

              011

         ^   100    

              111=7

    如果此文对您有帮助,微信打赏我一下吧~

  • 相关阅读:
    leetcode-----5. 最长回文子串
    leetcode-----4. 寻找两个正序数组的中位数
    leetcode-----3. 无重复字符的最长子串
    leetcode-----2. 两数相加
    leetcode-----1. 两数之和
    leetcode-----第 26 场双周赛
    leetcode-----104. 二叉树的最大深度
    leetcode-----103. 二叉树的锯齿形层次遍历
    leetcode-----102. 二叉树的层序遍历
    数据管理必看!Kendo UI for jQuery过滤器的全球化
  • 原文地址:https://www.cnblogs.com/Joanna-Yan/p/5080935.html
Copyright © 2020-2023  润新知