gpt4 book ai didi

storage - 存储单个位

转载 作者:行者123 更新时间:2023-12-01 23:18:49 25 4
gpt4 key购买 nike

我的问题可能看起来有点业余,但我无法在任何地方在线找到答案。不久前,Minecraft 的一位开发者谈到了门在游戏中的存储方式 (link)。他说它们是用 4 位存储的。 2 表示方向,1 表示它是上部还是下部,1 表示它是打开还是关闭。这让我想到了你是怎么做到的。你看到存储一个字节是因为一个 ASCII 字符是一个字节。但是,您不能只将一些字符写入只有一位的文件中,因为字符不能仅用一位存储,它们是以字节形式存储的。我知道一个位表示为 1 或 0。但是将 1 或 0 写入文件将给你 4 个字节而不是一个位。那么这是怎么做到的呢?

谢谢。

最佳答案

这很可能是通过组合不同的二进制标志来完成的。为了能够给你一个清晰的解释,你必须理解数字是如何按位表示的。基本上,它就像十进制数,唯一的区别是只有两个数字可用。下面是一个示例(二进制表示形式的十进制数 0-16)。

Decimal     Binary

0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
16 10000

这正是您的计算机存储数字的方式。您还必须对按位运算符有基本的了解。假设您有两行 8 位,如下所示:

10101010
01011111

如果您使用按位或运算符 - “|” 组合这两行- 如果第 1 行的位 x 为 1 或第 2 行的位 x 为 1,则输出的位 x 为 1。因此在我们的例子中,结果将如下所示:

11111111

按位与运算符 (&) 检查第 1 行的位 x 是否为 1 和第 2 行的位 x 是否为 1。在我们的例子中,这是输出:

00001010

按位异或(异或)运算符 (^) 检查是否只有一行的位 x 为 1。我们的输出看起来像这样:

11110101

基本上,Minecraft 的开发人员所做的就是定义一些标志。

// this is just an example, not Minecraft's actual code

public static final byte ORIENTATION_SOUTH = 0; // 00000000
public static final byte ORIENTATION_NORTH = 1; // 00000001
public static final byte ORIENTATION_WEST = 2; // 00000010
public static final byte ORIENTATION_EAST = 3; // 00000011

public static final byte PART_UPPER = 4; // 00000100 - third bit is 1
public static final byte PART_LOWER = 0; // 00000000 - third bit is 0

public static final byte STATE_OPEN = 8; // 00001000 - fourth bit is 1
public static fianl byte STATE_CLOSED = 0; // 00000000 - fourth bit is 0

所以如果他们想要一个门的上半部分朝西并且打开的门状态,他们会这样写:

byte state = ORIENTATION_WEST | PART_UPPER | STATE_OPEN;

按位,它看起来像这样:

00000010 | (orientation)
00000100 | (part)
00001000 (open or closed)

然后会变成:

00001110 (west, upper part, open)

虽然只使用了byte的前4位,但是正如你所说,你不能只保存位。很可能整个字节都被保存了。

关于storage - 存储单个位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9146279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com