| 关键词: nbsp byte 0000 字节 高位 一个 Bit byteStr 数据 return |
项目中通过信号采集板的数据获取车上仪表盘指示灯的信息,将接收到的数据转成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^25-1) int:4个字节(32位) (-2147483648~2147483647) (-2^31~2^31-1) long:8个字节(84位) (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 11 00 空位补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 | 00 00 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 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|