博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何获取byte的各个bit值以及常见位操作
阅读量:7088 次
发布时间:2019-06-28

本文共 2896 字,大约阅读时间需要 9 分钟。

项目中通过信号采集板的数据获取车上仪表盘指示灯的信息,将接收到的数据转成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

 

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

转载地址:http://bryql.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
常见的矩阵 面试算法(4)
查看>>
我的友情链接
查看>>
修复Strtus远程命令执行漏洞 : Strtus 2.2.3 升级到 Strtus 2.3.24
查看>>
企业如何防止客户资料、财务数据、供应链,工资单等机密数据泄密事件发生?...
查看>>
return与exit区别
查看>>
我的友情链接
查看>>
正则匹配\知识点
查看>>
WIN7英文系统乱码错误解决方案
查看>>
vagrant box php开发环境配置 -- redis安装
查看>>
Java动态编译类小案例
查看>>
eclipse 本地连接hadoop 进行开发
查看>>
开发注意事项总结
查看>>
英语美文20篇
查看>>
如何做到完成任务和内功修炼的完美统一
查看>>
使用cornerstone是的灵异事件
查看>>
Java Objects-------------工具类使用
查看>>
Intellij IDEA 自动生成 serialVersionUID
查看>>
[zz]新浪微博中那些符号@##//
查看>>
【用户调研】与用户沟通需要的技巧
查看>>