`

温习二进制(网上转的)

阅读更多


关于将byte转为int时,为啥要 & 0xFF




byte b = -1;

// 它的结果是:ffffffff
Sytem.out.println( Integer.toHexString(b) );

// 它的结果是:ff
System.out.println( Integer.toHexString(b & 0xFF) );

// 主要是再将byte转为int时,会在前面补上24位1 (byte的8位 -> int的32位),不理解的看下面,很详细。等于复习了。





1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式

在这里先温习下计算机基础理论

byte是一个字节保存的,有8个位,即8个0、1。
8位的第一个位是符号位,
也就是说0000 0001代表的是数字1
1000 0000代表的就是-1
所以正数最大位0111 1111,也就是数字127
负数最大为1111 1111,也就是数字-128

上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码

1、反码:
一个数如果是正,则它的反码与原码相同;
一个数如果是负,则符号位为1,其余各位是对原码取反;

2、补码:利用溢出,我们可以将减法变成加法
对于十进制数,从9得到5可用减法:
9-4=5 因为4+6=10,我们可以将6作为4的补数
改写为加法:
9+6=15(去掉高位1,也就是减10)得到5.

对于十六进制数,从c到5可用减法:
c-7=5 因为7+9=16 将9作为7的补数
改写为加法:
c+9=15(去掉高位1,也就是减16)得到5.

在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。

⑴一个数为正,则它的原码、反码、补码相同
⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1

- 1的原码为 10000001
- 1的反码为 11111110
+ 1
- 1的补码为 11111111

0的原码为 00000000
0的反码为 11111111(正零和负零的反码相同)
+1
0的补码为 100000000(舍掉打头的1,正零和负零的补码相同)

Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。
和0xff相与后,高24比特就会被清0了,结果就对了。

----
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。

而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。

分享到:
评论

相关推荐

    运算机组成原理温习总结.pdf

    9. **位(bit)**:计算机中最小的数据单位,一个位表示一个二进制数(0或1)。 10. **字(word)**:计算机进行数据运算和存储的基本单位,字的长度(字长)取决于计算机系统,常见的有8位、16位、32位和64位。 ...

    精品资料(2021-2022年收藏)高二会考计算机基础知识汇总.doc

    计算机内部使用二进制码处理数据和指令。例如,二进制数10110001对应十进制数177。 6. 微处理器与输入输出设备 微处理器芯片通常集成了控制器和运算器。保持计算机正常运行的必备输入输出设备是键盘和显示器。 7...

    数字电路基础,比较全面的数字电路学习资料

    首先,我们需要理解二进制系统,它是数字电路运算的基础。二进制由0和1两个符号构成,能够表示所有的数值和逻辑状态。数字电路正是通过这两个基本符号进行信息处理的。 逻辑门是数字电路的基本元件,包括与门、或门...

    C#位运算以及实例计算详解

    程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作。 了解: 在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:...

    嵌入式软件开发期末考试温习资料.pdf

    1. 一般文件:包括文本文件、shell脚本、二进制可执行程序和各种数据文件。 2. 目录文件:存储文件名和子目录名以及指向它们的指针。 3. 链接文件:分为硬链接和软链接,硬链接指向同一inode,软链接则类似于快捷...

    大学计算机基础第一章教案.doc

    课程中还会讲解数制转换,包括二进制、八进制、十进制和十六进制之间的转换方法,以及计算机数据的编码方式,如ASCII码和汉字编码。此外,还会涉及计算机语言的不同类型,如机器语言、汇编语言和高级语言,以及如何...

    (完整word)C语言基础知识测试题-全面完整.doc

    14. 位运算符:位运算符用于对二进制数进行位ewise运算,如&、|、^等。 15. 赋值运算符:赋值运算符用于将一个值或表达式的结果赋给变量,如=、+=、-=等。 16. 条件表达式:条件表达式用于根据条件的真假来执行...

    广工 计算机系统结构考前冲刺(考点+每年必考真题)

    2. 数据表示:包括二进制、八进制、十六进制的转换,浮点数的存储格式(如IEEE 754)。 3. 运算器设计:算术逻辑单元(ALU)的工作原理,各种算术和逻辑运算的实现。 4. 存储系统:内存层次结构(寄存器、高速缓存、...

    慕课 北大陆俊林计算机组成 课件.7z

    2. **数据表示与运算**:讲述二进制、八进制、十六进制和十进制之间的转换,以及数值、字符、浮点数在计算机中的表示方法,同时涵盖逻辑运算和算术运算。 3. **运算器设计**:详述加法器、比较器、乘法器等运算部件...

    mickey0524.github.io:mickey的个人博客

    简单描述: 使用github.io搭建的个人博客,旨在计算平时...leetcode-计算二进制子串和分配饼干 redis的API简介 python之time基础 python正确使用 multiprocessing 的姿势 tmux介绍 天秀的db写法 用JavaScript获取图片

    leetcode答案-leetcode-java:leetcode-java

    1. 代码优化:通过减少空间复杂度和时间复杂度,提高代码效率,例如利用哈希表进行查找优化,使用二进制搜索减少比较次数。 2. 性能分析:了解并使用JVM内存模型,理解对象创建、垃圾回收等过程,避免内存泄漏。 3. ...

    程序开发+C语言+顺序程序设计章节源码题+适用于初学者

    资深一线科研型大学讲师带你一起温习C语言,跟着我学习可以让你更快上手实用,因为作者有丰富的研发经验,特别是到后期高阶知识点阶段,更能显示出初学与有经验者的区别,关注我,持续更新中。该资源是谭浩强《C程序...

Global site tag (gtag.js) - Google Analytics