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() 转换一 ...
随机推荐
- Element ui表格展示图片问题
当需要遍历图片时,不能直接使用prop绑定值,具体 代码如下 <el-table-column label="头像" width="100"> &l ...
- spring mvc常用注解的说明
最近一段时间学习了springboot,所以熟悉一下mvc中常用的注解,这样可以方便开发 简介: @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类 ...
- git使用教程之git基础
1 获取Git仓库 在现有目录中初始化仓库 git init 克隆现有的仓库 git clone https://github.com/yangwang12345/node_test.git Git ...
- javascript中数组与字符串之间的转换以及字符串的替换
数组转化为字符串: var a=['aa','bb','cc']; var b=a.join('-'); console.log(b)----->'aa-bb-cc' 字符串中的替换: 1.re ...
- rem 单位
rem(font size of the root element)是指相对于根元素的字体大小的单位. 主流的一些web app的适配解决方案: 流式布局: 流式布局在页面布局的时候都是通过百分比 ...
- progress 相关事件 异步 ajax
loadstart — Fires when the fi rst byte of the response has been received.progress — Fires repeatedly ...
- G彩娱乐网一个程序员到一个销售高手的心路历程
0.引言 我大学本科读的是理工科,后来毕业以后,我逐渐走上了程 序员的道路.每天面对电脑一行一行的敲代码,这被我们程序员们戏称为"搬砖头",因为我们所做的事跟民工搬砖头砌墙本质上是 ...
- [转]移动前端开发之viewport的深入理解
今天去面试,被问到一个用了一万次的东西,然而我并不了解具体是个毛毛,看这一篇豁然开朗. DevicePixelRatio 以及这句话:移动设备上的viewport分为layout viewport ...
- OpenCASCADE BRepMesh - 2D Delaunay Triangulation
OpenCASCADE BRepMesh - 2D Delaunay Triangulation eryar@163.com Abstract. OpenCASCADE package BRepMes ...
- oracle数据库热备中的备份和恢复及例子
手工热备(开库状态) 备份控制文件: alter database backup controlfile to '/u01/oradata/prod/con.bak1'; 备份数据文件(这里用到pl/ ...