bit 和 byte
bit
bit是计算机的最小的存储单元,一切数据最终都以bit的形式存放在计算机之中。
一个bit有且只有两种状态。要么是0,要么是1。像这样:

多个bit组合在一起就可以构成更复杂的数据。例如,8个bit组合在一起就构成了一个byte:
0 1 1 1 1 1 1 1
byte
在Java中,byte是基本的数据类型,是一个有符号,也就是有正负之分的整数。最大值是127,最小值是-128。
127
127在计算机内部是如何存储的呢?当然是以二进制形式存储:
0 1 1 1 1 1 1 1
8个bit,右边是低位,左边是高位。黄色的bit是符号位,0表示正数,1表示负数。

-128
-128呢?

看着挺好解释的,2的7次方 = 128,符号位是1代表它是负数。是这样吗?
-1
-1的二进制表示如下:
1 1 1 1 1 1 1 1
是不是什么神奇?怎么会是8个1?要解释这个问题,就需要知道原码、反码、补码。
原码、反码、补码
原码
原码是数值对应的二进制表示形式,例如:
0: 0 0 0 0 0 0 0 0
1: 0 0 0 0 0 0 0 1
2: 0 0 0 0 0 0 1 0
对于正数,计算机存的就是原码。
-1的原码表示如下:
1 0 0 0 0 0 0 1
可是,对于负数,计算机存的是其补码。
反码
反码是对原码中的bit位取反,0变1,1变0。符号位除外,因为符号位表正负,不表数值。
原码:1 0 0 0 0 0 0 1
反码:1 1 1 1 1 1 1 0
补码
补码是在反码的基础上加1。还拿-1举例:

你是否理解补码了呢?考你一道题,-2在计算机里是如何表示的?
位运算
Java支持取反、与、或、异或等运算,接下来我一一举例。
取反
取反操作的运算符号是~,这个操作符可以将操作数的bit位逐一翻转。1 → 0,0 → 1。
例如:
a: 0 1 0 1 0 1 0 1
~a: 1 0 1 0 1 0 1 0
与
与运算的操作符号是&,它将两个操作数的bit位一一比对。如果记录比对结果呢?——规则如下:
- 如果两个操作数的bit位同时为
1,则记1 - 否则,记为
0
例如:
a: 0 0 0 0 1 1 1 1
b: 1 1 1 1 0 0 0 1
a&b: 0 0 0 0 0 0 0 1
或
或运算的操作符是|,它将两个操作数的bit位一一比对。如果记录比对结果呢?——规则如下:
- 如果两个操作数的bit位有一个为
1,则记为1 - 否则,记为
0
a: 0 0 0 0 1 1 1 0
b: 1 1 1 1 1 1 1 0
a|b: 1 1 1 1 1 1 1 0
亦或
亦或的操作符是^,它也是一一比较两个操作数的bit位,规则如下:
- 如果两个bit位相同,则记为
0 - 否则,记为
1
a: 0 0 0 0 1 1 1 1
b: 1 1 1 1 1 1 1 0
a^b: 1 1 1 1 0 0 0 1
位移
byte,short,int,long等整数都支持位移,也就是将bit位整体向左或者向右移动。
左移
左移的运算符为<<,它是这样操作输入数据的:
- 从左到右,每个bit都向左←移动
- 一个bit一个坑,左数第一个bit移出去,不要了
- 第2个bit占第1个bit的坑
- 第3个bit占第2个bit的坑,如此类推
- 最后会空出来一个bit位,用
0补充
例如:
a: 0 0 0 0 0 0 0 1
a<<1: 0 0 0 0 0 0 1 0
<<相当于对原数字做乘2操作。
如果是负数呢?
-1: 1 1 1 1 1 1 1 1
-1 << 1: 1 1 1 1 1 1 1 0
还记得前面的考题吧?计算机是如何存储-2的?
原码:1 0 0 0 0 0 1 0
反码:1 1 1 1 1 1 0 1
补码:1 1 1 1 1 1 1 0
-1 << 1等于-2。
右移(带符号位)
带符号位右移的操作符号是>>,它是这样操作的:
- 从右边第一个bit开始,逐一向右侧移动
- 第1个bit向右移,没地儿了,舍弃它
- 第2个bit向右移动到第1个bit的坑
- 第3个bit向右移动到第2个bit的坑,以此类推
符号位依旧向右移动- 用
符号位补充空出来的左边第一个位置
例如:
a: 0 0 0 0 0 0 1 0
a>>1: 0 0 0 0 0 0 0 1
>>1相当于把原数做除2的操作。再举一个负数的例子:
a: 1 0 0 0 1 0 0 0
a>>1: 1 1 0 0 0 1 0 0
1 0 0 0 1 0 0 0代表的是什么数呢?如果它是一个byte,只有8个bit,它就是-120。在Java中,可以加上0b前缀,告诉计算机这是二进制数(binary)。
System.out.println((byte) 0b10001000);
// -120
那如何用眼睛看出来呢?补码是怎么来的呢?
原码 → 反码 → 补码
逆转回去就知道原码了,也就是:补码 → 反码 → 原码:
- 既然补码是反码
+1来的,那补码-1就是反码了。 - 既然反码是原码取反得来的,那对反码取反就能得到原码。(不忘了符号位不变)
例如:
补码:1 0 0 0 1 0 0 0
反码:1 0 0 0 0 1 1 1
原码:1 1 1 1 1 0 0 0
右移(不带符号位)
>>>和>>的区别是,它是这样操作的:
- 从右边第一个bit开始,逐一向右侧移动
- 第1个bit向右移,没地儿了,舍弃它
- 第2个bit向右移动到第1个bit的坑
- 第3个bit向右移动到第2个bit的坑,以此类推
- 符号位依旧向右移动
- 用
0补充空出来的左边第一个位置
例如:
a: 0 0 0 0 0 0 1 0
a>>1: 0 0 0 0 0 0 0 1
a>>>1: 0 0 0 0 0 0 0 1
再举个负数的例子:
a: 1 0 0 0 1 0 0 0
a>>1: 1 1 0 0 0 1 0 0
a>>>1: 0 1 0 0 0 1 0 0
上面讲的都是移动1个bit,也可以移动多个bit的,例如:
a: 0 0 0 0 0 0 0 1
a<<1: 0 0 0 0 0 0 1 0
a<<2: 0 0 0 0 0 1 0 0
a<<3: 0 0 0 0 1 0 0 0
a<<4: 0 0 0 1 0 0 0 0
a<<5: 0 0 1 0 0 0 0 0
a<<6: 0 1 0 0 0 0 0 0
a<<7: 1 0 0 0 0 0 0 0
a<<8: 0 0 0 0 0 0 0 0
a<<9: 0 0 0 0 0 0 0 0
a<<100: 0 0 0 0 0 0 0 0
bit 和 byte的更多相关文章
- weblogic漏洞总结 复现(未完)
复现方式 Docker复现 WEBlogic爆出了很多漏洞 先了解一下现在主流的版本 Weblogic 10.3.6.0 Weblogic 12.1.3.0 Weblogic 12.2.1.1 Web ...
- go语言:多个[]byte数组合并成一个[]byte
场景:在开发中,要将多个[]byte数组合并成一个[]byte,初步实现思路如下: 1.获取多个[]byte长度 2.构造一个二维码数组 3.循环将[]byte拷贝到二维数组中 package gst ...
- Android-Drawable、Bitmap、byte[]、资源文件相互转换
我们在Android的开发中,经常可以遇到图片的处理,当中,有很多是 Bitmap.Drawable.byte[]和资源文件它们直接相互转换. 今天就此总结一下: 1.资源文件转为Drawable 2 ...
- byte[] 转成图片方法
/// <summary> /// ImageData 的摘要说明 /// </summary> public class ImageData : IHttpHandler { ...
- flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法
flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...
- .NET和JAVA中BYTE的区别以及JAVA中“DES/CBC/PKCS5PADDING” 加密解密在.NET中的实现
场景:java 作为客户端调用已有的一个.net写的server的webservice,输入string,返回字节数组. 问题:返回的值不是自己想要的,跟.net客户端直接调用总是有差距 分析:平台不 ...
- 用java String类的getBytes(String charsetName)和String(byte[] bytes, String charsetName)解决乱码问题
Java中String的数据是如何存储的,查看源代码就可以知道,String的数据是存储在char[] value这样一个成员变量中的,char类型的大小在java中是2个字节 我们还知道,现在普遍使 ...
- 字节、字、bit、byte的关系
字 word 字节 byte 位 bit 字长是指字的长度 1字=2字节(1 word = 2 byte) 1字节=8位(1 byte = 8bit) 一个字的字长为16 一个字节的字长是8 bps ...
- Stream与byte[]与Image与string
public byte[] GetByteImage(Image img) { byte[] bt = null; if (!img.Equals(null)) { using (MemoryStre ...
- int[] convert byte[]
private void button_Click(object sender, RoutedEventArgs e) { byte[] bytes = this.ConvertIntArrayToB ...
随机推荐
- jQuery源码逐行分析学习01(jQuery的框架结构简化)
最近在学习jQuery源码,在此,特别做一个分享,把所涉及的内容都记录下来,其中有不妥之处还望大家指出,我会及时改正.望各位大神不吝赐教!同时,这也是我的第一篇前端技术博客,对博客编写还不是很熟悉,美 ...
- ASP.NET MVC 播放远程服务器上的MP3文件
问题: 做需求遇到需要播放远程服务器上的MP3音频,使用FTP去获取文件.但是一般都是在页面 <audio> 的src 中直接写文件地址来播放音频.实在不想做临时文件,折腾了半天终于可以通 ...
- xBIM WeXplorer
目录 基础 xBIM WeXplorer 简要介绍 xBIM WeXplorer xViewer 基本应用 xBIM WeXplorer xViewer 浏览器检查 xBIM WeXplorer xV ...
- BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]
2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...
- java windows自动化-mail自动发邮件
本文旨在让测试人员了解如何发邮件 发邮件的话,最简单的事是直接手动发邮件,但是在自动化测试中,应做到让机器或者代码来自动发送邮件,笔者大概了解以下几种方法,总有一款口味适合你:1java代码来做下面即 ...
- JavaScript之父谈JavaScript
本文翻译自popularity,为了更好的阅读我把部分内容进行了增删改,如果你英语比较好,建议直接阅读原文,因为这篇文章是我通过google翻译再进行修改的. 貌似(根据一位精神导师的说法)JavaS ...
- ECMAScript 6 笔记(一)
一.ECMAScript 6简介 1996年11月,JavaScript的创造者Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国际标准.次年,ECM ...
- Java并发系列[5]----ReentrantLock源码分析
在Java5.0之前,协调对共享对象的访问可以使用的机制只有synchronized和volatile.我们知道synchronized关键字实现了内置锁,而volatile关键字保证了多线程的内存可 ...
- 不受支持的URL Statue Code 1002
1. 错误提示: Error description=Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" User ...
- hplus--H+ V2.3 (中文版)
一个高大上的后台模板 演示地址 http://www.zi-han.net/theme/hplus/?v=4.1 下载地址 http://download.csdn.net/detail/u01197 ...