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

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

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

  1. Entity Framework 6 Recipes 2nd Edition(12-8)译 -> 重新获取一个属性的原始值

    12-8. 重新获取一个属性的原始值 问题 在实体保存到数据库之前,你想重新获取属性的原始值 解决方案 假设你有一个模型 (见 Figure 12-11) 表示一个员工( Employee),包含工资 ...

  2. js设置、获取单值cookie和多值cookie

    js设置.获取单值cookie和多值cookie,代码如下: var CookieUtil = (function () { var Cookie = function () { // 获取单值coo ...

  3. Pyqt 获取动态生成的QLineEdit值

    动态生成控件参考上一篇: http://www.cnblogs.com/dcb3688/p/4588814.html 那如何获取动态生成控件的值呢? 比如,动态的生成10个输入框QLineEdit,输 ...

  4. C#获取json字符串指定的值

    Newtonsoft.Json在json和对象之间转化是一个非常强大的工具. 对象转化json字符串 Newtonsoft.Json.JsonConvert.SerializeObject() jso ...

  5. orm获取关联表里的属性值

    ORM——关系对象模型 laravel中的Eloquent ORM用于和数据表互动,其中每个数据库表会和一个对应的「模型」互动,想要了解请查看官方文档或自行百度.获取关联表里的属性值代码如下: /** ...

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

    今天发现用mysql_insert_id()获取到的新增记录的id不正确, 虽然发现源代码的事务写的有问题,但是最根本的原因是,我插入数据的id类型是bigint型 获取MySql新增记录ID值的方法 ...

  7. 获取表单选中的值(利用php和js两种方式)

    php代码中获取表单中单选按钮的值: (单选按钮只能让我们选择一个,这里有一个“checked”属性,这是用来默认选取的,我们每次刷新我们的页面时就默认为这个值.) 例: <form name= ...

  8. 如何用jquery获取页面下HiddenField的值··

    怎么用jquery获取页面上HiddenField的值·· 怎么用jquery获取页面上HiddenField的值··?HiddenField的值是从后台赋值的··· 先赋值给Hiddenfield ...

  9. Js获取后台集合List的值和下标的方法

    Js获取后台集合List的值和下标的方法 转载自:http://blog.csdn.net/XiaoKanZheShiJie/article/details/47280449 首先用的是struts2 ...

随机推荐

  1. 10分钟学会前端调试利器——FireBug

    概述 FireBug是一个用于网站前端开发的工具,它是FireFox浏览器的一个扩展插件.它可以用于调试JavaScript.查看DOM.分析CSS.监控网络流量以及进行Ajax交互等.它提供了几乎前 ...

  2. USACO翻译:USACO 2012 FEB Silver三题

    USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...

  3. SharePoint 2010中一些必须知道的限制

    最大文件名长度是123个字符. 一个文档库(library)里最多可以存放10000个文档 一个视图(view)里最多显示5000个条目(item) 推荐的单个内容数据库(content databa ...

  4. LINUX 下时间转换为秒数

    linux下时间是从1970.1.1开始算的秒数 //转来自网址 http://blog.csdn.net/wind19/article/details/6579495 $ dateTue Feb 3 ...

  5. java线程学习

    线程概念 当我问别人什么是线程的时候,别人给我讲了一大堆线程如何创建,如何使用以及若干线程的高深问题,其实作为一个资深菜鸟,我就想问问,什么是线程而已,找了书中的一些概念总结了一下,多线程与操作系统中 ...

  6. madplay播放控制

    管理madplay的主程序,包括播放,暂停播放,恢复播放,停止播放system("madplay north.mp3 &");//利用system函数调用madplay播放 ...

  7. 深圳本土web前端经验交流

    群号:125776555  深圳本土web前端技术交流群 baidu tencent前端拒绝垃圾广告.吹水,欢迎讨论技术.跳槽经验期待您的加入 

  8. 《App研发录》 源码

    第1章源码: 1.1 重新规划Android项目结构 1.1.zip 1.2 为Activity定义新的生命周期 1.2.zip 1.3 统一事件编程模型 1.3.zip 1.4 实体化编程 1.4. ...

  9. Rxjava异常处理

    异常处理 在Rxjava订阅的Observable有时会抛出异常,在RxJava中有两大类策略,一个是准备备用的Observable,在发生异常时将subscriber订阅到新的Observable上 ...

  10. Hystrix框架1--入门

    介绍 在开发应用中或多或少会依赖各种外界的服务,利用各个服务来完成自己的业务需求,现在流行的微服务架构更是离不开各个服务之间的调用,这就导致整体应用的可用性依赖于各个依赖服务的可用性. 比如一个依赖3 ...