16进制到byte转换
我们经常会看到这样的语法
(byte) 0xAD
0xAD实际是个16进制,转换成二进制为:10101101,转换成10进制是:173,它是个正数
10101101只是int的简写,int由4个byte字节,即32位bit组成,实际的值是
(00000000 00000000 00000000 )10101101
int由4 byte组成,因此int转byte是会掉位的,直接截取最后一个字节,即:
10101101
符号位是1,因此它是负数,负数的存储方式是补码。因此要先求出补码才能计算值。
求补码方式为:
符号位不变,其他位取反,然后+1,映射到这里则为
11010010 + 1 -> 11010011 则值为 -(2^6+2^4+2^1+2^0) = -83
因此0xAD = 173 ,(byte) 0xAD=-83
有时候,我们会有一种特殊的需求,比如用bit位上的0或者1表明某一个值是否存在,如
0000 0101 可以表示第0位 -> 1 -> 存在
第1位 -> 0 -> 不存在
第2位 -> 1 -> 存在
……
这样,一个byte就能表示8个位置是否有值,可用于8个不同类型的值是否存在,或者用于排序数字
这样做的好处是利用一个byte有8bit的特点标识8种情况,大量节省了空间,并且当一个byte转换成二进制时,可以立即清楚某一位是否存在,从这个意义上来说,他比你声明8个byte更清晰,而且标识的范围更广,因为他还可以处理同时存在的逻辑。
当然,有利就有弊,如果想用于数据库按标识查询,则需要人为来处理多种情况,这甚至是及其复杂的,诸如存在mysql某一列,又需要按字段进行条件匹配时,不推荐此方式
当获取到byte,判断某一位bit是否为1的方式
/**
* 比如3的二进制是 0000 0011
* isBitV1(3,0) 是1 true
* isBitV1(3,1) 是1 true
* isBitV1(3,2) 是0 false
* 判断byte的某一位上是否有值
*
* 0x1其实就是1,1的二进制是0000 0001
* @param b
* @param position 第几位
* @return
*/
private boolean isBitV1(byte b, int position) {
if (position == 0) {
return (b & 0x1) > 0;
} else {
return (b >> position & 0x1) > 0;
}
}
0x1是16进制,表示1,之所以很多源码里面喜欢用0x1,而不是1,我推测是这样少了一次int转2进制或16进制的转换,效率更高
16进制到byte转换的更多相关文章
- bgcolor RGB 和16进制之间的转换,16进制转RGB,源码
<p>bgcolor RGB 和16进制之间的转换,16进制转RGB,源码例如:<br /> 输入 201,255,201 转换成 #C9FFC9</p> < ...
- Java Hex 16进制的 byte String 转换类
package mobi.dzs.android.util; import java.util.Locale; /** * 16进制值与String/Byte之间的转换 * @author Jerry ...
- AES加密 16进制与二进制转换
import java.security.Key; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax ...
- C#串口通讯中常用的16进制的字节转换
1.对于通讯协议的十六进制数值进行简单转换 //二进制转十进制Console.WriteLine("二进制 111101 的十进制表示: "+Convert.ToInt32(&qu ...
- Guid和Oracle中16进制字符的转换
我们知道在Oracle中存的guid是16进制字符串,而在我们的C#代码中存的是guid对象,这样我会就要进行转换, 下面给出了两者进行转换的方法: public class Guid2RawProc ...
- java字节数组和16进制之间的转换
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ pac ...
- [iOS]把16进制(#871f78)颜色转换UIColor
// // ViewController.m // text // // Created by 李东旭 on 16/1/22. // Copyright © 2016年 李东旭. All rights ...
- C#中2、8、16进制 有符号转换10进制正负数
曾经让我苦想的其他进制转有符号整型问题,结果自己想到方法解决后才发现原来如此简单. 1.Int16(2个byte长度 ) : 方法 :Convert.ToInt16(进制编码,进制) a.16进制转1 ...
- Python内置进制转换函数(实现16进制和ASCII转换)
在进行wireshark抓包时你会发现底端窗口报文内容左边是十六进制数字,右边是每两个十六进制转换的ASCII字符,这里使用Python代码实现一个十六进制和ASCII的转换方法. hex() 转换一 ...
随机推荐
- emacs elpy代码补全功能
emcas中使用elpy编辑python代码,经常需要格式化代码 格式化代码方法C-c C-r f (elpy-format-code) 使用这个快捷键时,需要保证两点, 1.已经安装了yapf或者a ...
- IOS学习——iphone X的适配
说实话,对于一个刚入门iOS两个月的新手而言,在拿到这个任务的时候整个人都是懵逼的,怎么做适配?哪些地方需要适配?该怎么做?一个个问题搞得头都大了. 首先,啥都不管,先在iPhone X上运行起来看看 ...
- grid 布局
display:grid 是一种新的布局方式,旧的布局方式通常有副作用,例如float(需要额外修复浮动)或者inline-block(两个元素之间的空格问题) 把父元素定义为grid,就像表格一 ...
- instanceof 原理
运行流程 function instance_of(L, R) { //L 表示左表达式,R 表示右表达式 var O = R.prot ...
- Problem F: 合唱比赛开始了!
Problem F: 合唱比赛开始了! Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 440 Solved: 201[Submit][Status][ ...
- 使用js获取数组中最大、最小的数字
1.查询最大值 var maxValue=Math.max.apply(Math,array); 2.查询最小值 var minValue=Math.min.apply(Math,array);
- JSTL中foreach与fn表达式
在jstl中的fn标签也是我们在网页设计中经常要用到的很关键的标签,在使用的时候要先加上头 <%@ taglib uri=" http://java.sun.com/jsp/jstl/ ...
- Spring面试题目
问题清单: 1. 什么是Spring框架?Spring框架有哪些主要模块? 2. 使用Spring框架有什么好处? 3. 什么是控制反转(IOC)?什么是依赖注入? 4. 请解释下Spring中的IO ...
- IE浏览器中用Firebug调试网站的方法
对于大部分做前端设计者而言应该都使用过Firefox浏览器下一款调试网站的扩展插件firebug吧,功能非常的强大,对于我们找出网页兼容性的问题非常的有效.不过对于很多不喜欢使用Firefox浏览器的 ...
- mysql数据库事务详细剖析
在写之前交代一下背景吧! 做开发也好久了,没怎么整理过知识,现在剖析一下自己对数据库事务的认识,以前用sqlserver,现在转java后又用mysql.oracle.我这块就主要解释一下mysql数 ...