如何获取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
如果此文对您有帮助,微信打赏我一下吧~
如何获取byte的各个bit值以及常见位操作的更多相关文章
- Entity Framework 6 Recipes 2nd Edition(12-8)译 -> 重新获取一个属性的原始值
12-8. 重新获取一个属性的原始值 问题 在实体保存到数据库之前,你想重新获取属性的原始值 解决方案 假设你有一个模型 (见 Figure 12-11) 表示一个员工( Employee),包含工资 ...
- js设置、获取单值cookie和多值cookie
js设置.获取单值cookie和多值cookie,代码如下: var CookieUtil = (function () { var Cookie = function () { // 获取单值coo ...
- Pyqt 获取动态生成的QLineEdit值
动态生成控件参考上一篇: http://www.cnblogs.com/dcb3688/p/4588814.html 那如何获取动态生成控件的值呢? 比如,动态的生成10个输入框QLineEdit,输 ...
- C#获取json字符串指定的值
Newtonsoft.Json在json和对象之间转化是一个非常强大的工具. 对象转化json字符串 Newtonsoft.Json.JsonConvert.SerializeObject() jso ...
- orm获取关联表里的属性值
ORM——关系对象模型 laravel中的Eloquent ORM用于和数据表互动,其中每个数据库表会和一个对应的「模型」互动,想要了解请查看官方文档或自行百度.获取关联表里的属性值代码如下: /** ...
- PHP获取MySql新增记录ID值的方法
今天发现用mysql_insert_id()获取到的新增记录的id不正确, 虽然发现源代码的事务写的有问题,但是最根本的原因是,我插入数据的id类型是bigint型 获取MySql新增记录ID值的方法 ...
- 获取表单选中的值(利用php和js两种方式)
php代码中获取表单中单选按钮的值: (单选按钮只能让我们选择一个,这里有一个“checked”属性,这是用来默认选取的,我们每次刷新我们的页面时就默认为这个值.) 例: <form name= ...
- 如何用jquery获取页面下HiddenField的值··
怎么用jquery获取页面上HiddenField的值·· 怎么用jquery获取页面上HiddenField的值··?HiddenField的值是从后台赋值的··· 先赋值给Hiddenfield ...
- Js获取后台集合List的值和下标的方法
Js获取后台集合List的值和下标的方法 转载自:http://blog.csdn.net/XiaoKanZheShiJie/article/details/47280449 首先用的是struts2 ...
随机推荐
- 制作dll自动注册工具
记录一个简单的dll自动注册工具制作:主要用到的是DllRegisterServer()方法,其实我们平常注册dll文件内部都会调用这个方法. 这里我就直接写在主程序里面了,需要注意的地方也直接在代码 ...
- chrome浏览器js 导出excel
<table id="table"> <tr> <th>ID</th> <th>姓名</th> <th ...
- 下订单存储过程 - MYSQL
BEGIN DECLARE smark INT; DECLARE orderId INT; /*查询课程是否存在,如果不存在就不执行订单操作了*/ ) FROM t_course WHERE id = ...
- 安装windows server 2012 r2 的那点事儿
windows server 2012 r2 安装无法找到install.wim 错误代码0x80070026,以及制作U启动盘决解ISO文件超过5G大小限制的解决方案 用UltaISO刻录后,sou ...
- USACO翻译:USACO 2014 FEB SILVER 三题
USACO 2014 FEB SILVER 一.题目概览 中文题目名称 自动打字 路障 神秘代码 英文题目名称 auto rblock scode 可执行文件名 auto rblock scode 输 ...
- Public key for mysql....rpm is not installed
解决方案: 此时导入rpm的签名信息即可,用root登录,执行下面命令(我的linux版本是centos 5.1) 原文地址: http://my.oschina.net/u/555639/blog/ ...
- 让Response.Redirect页面重定向更有效率
用 Redirect 方法可将浏览器重定向到另一个 URL,而不是将内容发送给用户. 这里有一篇文章介绍使用Redirect<Using Response.Redirect Effectivel ...
- Hadoop学习笔记—19.Flume框架学习
START:Flume是Cloudera提供的一个高可用的.高可靠的开源分布式海量日志收集系统,日志数据可以经过Flume流向需要存储终端目的地.这里的日志是一个统称,泛指文件.操作记录等许多数据. ...
- ASP.NET MVC 防止 CSRF 的方法
MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cross ...
- 我的权限系统设计实现MVC4 + WebAPI + EasyUI + Knockout(一)
一.前言 之前的博客一直都还没写到框架的实现及权限系统,今天开始写我的权限系统,我以前做过的项目基本上都有权限管理这个模块,但各个系统都会有一些不太一样,有些简单点,有些稍微复杂一点,一句话,我们做的 ...