如何获取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^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 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

时间: 2024-10-05 05:31:18

如何获取byte的各个bit值以及常见位操作的相关文章

如何用vba获取文件的MD5 Hash值?

MD5 可以作为文件的指纹. MD5就可以为任何文件(不管其大小.格式.数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化. 如果要获取任意文件的MD5值,可以使用这些API函数直接获取MD5Init ,MD5Update,MD5Final . 可以使用如下的代码: Option Base 0 Public Type MD5_CTX i(1) As Long buf(3) As Long inc(63) As Byte dige

webBrowser控件中获取元素 的class 属性值

html 代码如下: <TR id="t030006" class="sr plus selected"> <TD><INPUT id=cvrgNo030006 value=030006 readOnly CHECKED type=checkbox jQuery1456994811776="96"></TD> <TD>车辆损失险 </TD> <TD style=&quo

Servlet获取ajax传递的json值

Servlet获取ajax传递的json值 其实标题可直接写为“记一件愚蠢的事”.另外声明这是只是一篇水文. 原本都用SpringMVC和ajax进行前后台的交互,今天打算试试用原始的Servlet与其进行交互. 起初是打算实现一个跳转(虽然感觉没什么意义): Action如下: package per.zww.ajax.action; import java.io.IOException; import javax.servlet.ServletException; import javax.

jquery获取checkbox被选中的值

只用一个循环,就可以找出被选中的checkbox的值 var s; $("[name = b]:checkbox").each(function () {                   if (this.checked) {                       s += $(this).val() + "|";                   }               });alert(s); 这样就可以了 jquery获取checkbox被

js如何获取选中radio单选按钮的值

js如何获取选中radio单选按钮的值:radio单选按钮在是非常常用的表单元素之一,经常需要获取被选中按钮的value属性值,下面就通过实例简单介绍一下如何使用javascript实现此功能,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.soft

sql server 获取每一个类别中值最大的一条数据

sql server 获取每一个类别中值最大的一条数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 /* 数据如下: name val memo a    2   a2(a的第二个值) a    1   a1--a的第一个值 a    3   a3:a的第三个值 b    1   b1--b的第一个

PHP获取MySql新增记录ID值的方法

今天发现用mysql_insert_id()获取到的新增记录的id不正确, 虽然发现源代码的事务写的有问题,但是最根本的原因是,我插入数据的id类型是bigint型 获取MySql新增记录ID值的方法有 1.使用语句 mysql_query("select max(id) from user",$link); 2.使用函数msyql_insert_id(); (1)mysql版 int mysql_insert_id ([ resource $link_identifier = NUL

jsp页面使用el 按key获取map中的对应值

jsp页面使用el 按key获取map中的对应值 转自:<jsp页面使用el 按key获取map中的对应值>地址:http://blog.csdn.net/baple/article/details/18517359 jsp页面中的代码: <script type="text/javascript"> var msgTip = "${msgs['loginError']}"; alert(msgTip); </script> 注意

Java byte 类型的取值范围是-128~127

为什么Java byte 类型的取值范围是-128-127 : http://blog.163.com/[email protected]/blog/static/47517863200911314245752/ java基本数据类型的取值范围: http://www.cnblogs.com/singlesoar/p/5688915.html