JavaRush /Java 博客 /Random-ZH /Java:位和字节
Viacheslav
第 3 级

Java:位和字节

已在 Random-ZH 群组中发布
Java:位和字节 - 1

介绍

如果人们用十进制计数,那么计算机就用二进制计数。程序员必须了解如何与人和计算机对话。这篇评论应该对解决这个问题有所帮助。有时候,显而易见的事情背后隐藏着一个完整的世界。我提议谈谈这个世界。例如,一周有7天。现在我们来回答这个问题:数字“7”是什么?)首先,它是一个整数(正)自然数。它也是一个十进制数。 十进制数是十进制系统中的数字。当我们说“十进制”时,意味着该数字系统的基数为 10。基数显示在给定的数字系统中可以使用多少位数字来表示一个数字。倒计时从零开始。因此,为了表示十进制数字系统中的数字,我们使用从 0 到 9 的数字。这很好,但我们不仅需要数到 9,还需要数到 9 以外的数字。怎样成为?例如,数字 10。要写这个数字,我们最多使用 2 位数字。十进制中每个数字的位置称为小数位。数字从右到左计算:
Java:位和字节 - 2
另外,十进制数可以展开如下:103 = 1*10^2 + 0*10^1 + 3*10^0
Java:位和字节 - 3
该数字基本上是从右向左增长的。也就是一开始是7,后来变成了10。因此,数字是从右开始数,从0开始。这一切是为了什么?这是因为我们不是计算机。我们以十进制(即基数 10)计数,而计算机则以二进制(即基数 2)计数。但这些数字系统中适用的规则是相同的。
Java:位和字节 - 4

二元系统

二进制和十进制很相似,唯一的区别是这里的限制不是10,而是2。我们举个例子来比较一下。我们如何用二进制表示 11?很简单:只需要​​将十进制数除以基数 2,即一列中的 11/2 即可。例子:
Java:位和字节 - 5
或者这是来自 WikiHow 的示例:
Java:位和字节 - 6
有趣的是,我们可以用与十进制相同的方式表示二进制数:二进制 111 = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Java:位和字节 - 7
从二进制到十进制的转换示例可以在在线计算器中看到。说到数字系统中的运算规则是相同的,让我们看看二进制系统中的加法:
Java:位和字节 - 8
正如您所看到的,我们在加法过程中以与十进制系统相同的方式传输数字。加法的分析可以看,例如这里: 顺便说一句,“放电”一词时常被提及。还有,这是什么? 地点只是代表数字的“结构元素”。也就是说,数字 10 由两个数字组成:我们需要 2 个数字、2 个位置、2 个元素来写这个数字。理解这一点对我们来说很重要,因为在二进制数字系统中,一个数字就是一个位。Bit这个词来源于英文“二进制数字”,即二进制数。它可以是 0 或 1。但是,正如我们将数字和单词作为一个整体而不是一个字母一个字母地读取一样,计算机也不会一次读取一位。对于RAM 中处理信息的最小“片段”(所谓的最小可寻址信息单元),读取 8 位序列。由于有 8 个,因此这一个被称为“八位组”。还有-更广为人知的单词Byte。要记住八位组,您可以记住单词octopus(八条腿)被翻译成英文为octopus。也就是说,这里与标题中的“octo”完全相同:
Java:位和字节 - 9
我们想一下,8位最多可以表示多少个数字?
Java:位和字节 - 10
这里出现了一个问题:负数怎么办?为了理解这一点,我们先来谈谈Java中字节是如何表示的
Java:位和字节 - 11

Java 和字节

在Java中我们怎么可以使用负数呢?很简单就完成了。在 Java 中,字节是有符号的。最左边的数字/位(也称为“最高有效位”)是一种“标记”,可以回答以下问题:“这个数字是负数吗?” 如果答案是肯定的,则标记的值为 1。否则为 0。让我们看一个如何将数字 5 变成负数 5 的示例:
Java:位和字节 - 12
根据这张图,您可以了解 Byte 值的限制:
Java:位和字节 - 13
还明确的是:
  • 如果我们将 127 加 1,我们会得到 -128。
  • 如果我们从 -128 中减去 1,就会得到 127。
因此,Java 中的 Byte 可以取 -128 到 127 之间的值。我们记得,一个字节是一个八位字节。最大数字/最高有效位的序列号为 7,因为我们从零开始计数。在这种情况下,很容易记住,一个字节等于-2的7次方(下限)到2的7次方减1(上限)。使用数据类型本身很简单。我们使用在线 Java 编译器“repl.it”作为本文的“沙箱”。https://repl.it/languages/java。例如,让我们运行将二进制形式的字节变量表示为字符串的代码:
class Main {
  public static void main(String[] args) {
    byte octet = 5;
    String bin = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
    System.out.println(bin);
  }
}
在使用 I/O 流时,会积极使用字节。您可以在 Oracle 教程中阅读更多内容:“ I/O Streams ”。此外,在 Java 中,您可以使用特殊文字将值指定为位:
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java:位和字节 - 14

位操作

谈到字节和位,就不能不提到各种位操作。最常见的操作可能是移位(按位移位或位移位)。这一切都是因为他们的结果具有明显的实际好处。什么用途?左移 N 个位置相当于将数字乘以 2N。向右移动类似于相同的除法。因此, 5<<2 == 5*Math.pow(2,2) 为了理解为什么会这样,让我们​​更详细地看这个例子:
Java:位和字节 - 15
按位否定 NOT(一元按位)由波浪号表示,可反转位。它被写成波形符,例如~5。
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
这再次说明,Java改变数字的符号时,除了将最末尾的位值取反之外,我们还执行+1。如果没有这个,正如我们所看到的,我们的数字 5 就会改变。为了使其保持与更改符号之前相同的数字,您需要执行 +1。仅当所有位的值为 1 时,按位 AND 才允许您将两个不同的数字保留为 1。有趣的是它可能具有一些应用优势:
int x=4;
System.out.println((x&1) != 1);
此代码检查数字 x 的奇偶校验。让我们看一个例子:
Java:位和字节 - 16
通过同时使用按位与和按位或,您可以使用掩码:
public static void main(String[] args) {
    byte optionA=0b0100;
    byte optionB=0b0010;
    byte optionC=0b0001;
    byte value = (byte)(optionB | optionC);
    // Check for optionB
    if ((optionC & value) != 0b0000) {
      System.out.println("Yes");
    } else {
      System.out.println("No");
    }
  }
有关详细信息,请参阅“ Java 中按位运算符的屏蔽选项” 。位操作是一个有趣的主题,对此已有单独的评论、文章和书籍撰写。从这里开始了通往密码学的漫长道路。作为本次审查的一部分,有必要了解它为何有效以及如何工作。有关位操作的更多信息,我建议阅读 tproger 的评论:“关于位操作”。

原始类型

所以,一个字节就是一个八位字节,即8位。很容易记住,Java 中也有 8 种基本类型,巧合的是。基本类型是内置于编程语言中的数据类型,即默认可用的数据类型。就 Java 可以使用的内存占用而言,字节是最小的原始数据类型。正如我们前面所说,一个字节占用8位。因此,最高有效位是数字7。因此,byte包含结果的从-2的7次方到2的7次方减1的值。还有哪些其他原始类型:
Java:位和字节 - 17
从表中我们可以看到,数据类型所占用的数据量成倍增加。即short=2*byte,int=2*short。其实很容易记住。请记住,字节 = 8 位。还记得它不能少的事实。在英语中,整数称为整数。它的原始类型被称为缩写 int。有一个正则整数——int。有短版,短版,长版,长版。相应地,int占用32位(4字节)。短版本小 2 倍 - 16 位(2 字节),长版本大两倍,即 64 位(8 字节)。所以一个int最多可以存储20亿、1亿左右的数字。而 long 最多可以存储大约 9 千万亿(一个好词)。还记得一个老笑话,新手程序员认为千字节有 1000 个字节,而成熟的程序员认为一公斤有 1024 克,我们可以这样理解:
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
顺便说一句,细心的读者可能会注意到,图中只有 7 种类型。8 原始类型是boolean。boolean 是一种布尔数据类型,只有两个值:true 和 false。但问题来了——它的尺寸是多少?Java虚拟机规范和“ 2.3.4.布尔类型”一节将回答我们:
Java:位和字节 - 18
也就是说,布尔值与 int 的数量相同。如果我们声明一个布尔数组,那么该数组的每个元素将占用1个字节。这些真是奇迹:)

结论

我建议您熟悉更多材料以进行巩固: #维亚切斯拉夫
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION