我们经常会看到这样的语法

(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转换的更多相关文章

  1. bgcolor RGB 和16进制之间的转换,16进制转RGB,源码

    <p>bgcolor RGB 和16进制之间的转换,16进制转RGB,源码例如:<br /> 输入 201,255,201 转换成 #C9FFC9</p> < ...

  2. Java Hex 16进制的 byte String 转换类

    package mobi.dzs.android.util; import java.util.Locale; /** * 16进制值与String/Byte之间的转换 * @author Jerry ...

  3. AES加密 16进制与二进制转换

    import java.security.Key; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax ...

  4. C#串口通讯中常用的16进制的字节转换

    1.对于通讯协议的十六进制数值进行简单转换 //二进制转十进制Console.WriteLine("二进制 111101 的十进制表示: "+Convert.ToInt32(&qu ...

  5. Guid和Oracle中16进制字符的转换

    我们知道在Oracle中存的guid是16进制字符串,而在我们的C#代码中存的是guid对象,这样我会就要进行转换, 下面给出了两者进行转换的方法: public class Guid2RawProc ...

  6. java字节数组和16进制之间的转换

    /* * To change this template, choose Tools | Templates * and open the template in the editor. */ pac ...

  7. [iOS]把16进制(#871f78)颜色转换UIColor

    // // ViewController.m // text // // Created by 李东旭 on 16/1/22. // Copyright © 2016年 李东旭. All rights ...

  8. C#中2、8、16进制 有符号转换10进制正负数

    曾经让我苦想的其他进制转有符号整型问题,结果自己想到方法解决后才发现原来如此简单. 1.Int16(2个byte长度 ) : 方法 :Convert.ToInt16(进制编码,进制) a.16进制转1 ...

  9. Python内置进制转换函数(实现16进制和ASCII转换)

    在进行wireshark抓包时你会发现底端窗口报文内容左边是十六进制数字,右边是每两个十六进制转换的ASCII字符,这里使用Python代码实现一个十六进制和ASCII的转换方法. hex() 转换一 ...

随机推荐

  1. Windows搭建golang开发平台

    Golang是谷歌开发的一款开源性语言,暂时比较方便的IDE有Inteillj Idea.LiteIDE.Eclipse(Golipse)等,使用起来比较方便的IDE:LiteIDE和Inteillj ...

  2. VS2008生成DLL并使用

    1.创建工程 2.在工程中添加类,创建.h和.cpp文件 //.h代码 /** 请注意此代码方法声明中的 __declspec(dllexport) 修饰符. 这些修饰符使 DLL 能够导出该方法以供 ...

  3. 暑假练习赛 004 E Joint Stacks(优先队列模拟)

    Joint StacksCrawling in process... Crawling failed Time Limit:4000MS     Memory Limit:65536KB     64 ...

  4. 基于node的websocket示例

    websocket:用语服务器端主动向客户端推送消息 本例基于koa框架编写用例:服务器端需要安装相关模块 koa koa-socket co等 服务器端脚本:(需要安装相关模块 koa koa-so ...

  5. Web前端性能优化全攻略[转载]

    1. 尽量减少 HTTP 请求 (Make Fewer HTTP Requests) 作为第一条,可能也是最重要的一条.根据 Yahoo! 研究团队的数据分析,有很大一部分用户访问会因为这一条而取得最 ...

  6. 串口接收模块(verilog) 波特率115200

    我来分享一下uart协议之接收verilog代码 顶层实例化 `timecale 1ns / 1ps////////////////////////////////////////////////// ...

  7. Maven快速使用阿里云的代理maven仓库

    自从开源中国的maven仓库挂了之后就一直在用国外的仓库,慢得想要砸电脑的心都有了.如果你和我一样受够了国外maven仓库的龟速下载?快试试阿里云提供的maven仓库,从此不在浪费生命…… 仓库地址: ...

  8. seajs笔记

    Amd和Cmd的区别有哪些? 1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行.不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同).CMD 推崇 ...

  9. c#读取Excel数据到Gridview

    #region 读取Excel数据到Gridview public void ReadExcel(string sExcelFile, GridView dgBom)    { DataTable E ...

  10. c++/cmake /Android NDK 动态链接库交叉编译笔记

    项目使用cmake管理,由于项目的需要,核心代码要求跨 Linux/Windows/Android 三平台.Windows和Linux都好说,但Android NDK费了一番功夫还是没有解决.临时的解 ...