gpt4 book ai didi

java - 字符算术 --- 基数 8 与基数 10

转载 作者:行者123 更新时间:2023-12-02 06:15:23 30 4
gpt4 key购买 nike

进行字符算术时,规则是以 10 为基数还是以 8 为基数进行计算?我的书上说'A' = 101(基数为8)或65(基数为10),但是当我将基数为8的字符值插入到我的书给出的关于说明这一点的示例中时,我得到了一些有趣的结果。下面的代码是我书中的一个凯撒密码示例,它试图找到新字符。如果我尝试转换 'Y' 并移动 8 个点来查找新字符,并且如果 ch = 'Y' 且 n = 8,我期望得到字符 'G'。

ch = (char)('A' + (Character.toUpperCase(ch) - 'A' + n) % 26); 

数学计算结果为
65 + (89 - 65 + 8) % 26 = 71 (以 10 为底)
101 + (131 - 101 + 8) % 26 = 113(基数为 8)

如果我将 71(基数 10)转换回基数 8,我将得到 107,这是字符“G”,这是正确的字符。我的问题是为什么我不能以 8 为基数执行字符算术? 113 是字符“K”,这是错误的字符。进行字符算术时的规则是将所有值转换为基数 10,然后将它们转换回基数 8?

最佳答案

计算机将值存储在内存中。其他一切都是为了我们愚蠢的人类大脑(和眼睛)的便利。默认情况下,在 Java 中,这些值的任何文本输出都将以 10 为基数(十进制)。

A 在 base10 中为 65,在 base8 中为 101(假设我们正在讨论保留 US-ASCII 值的字符集)。

当谈论 Java 中的文字时,默认情况下它们被解释为 base10。要使用八进制文字,您需要在其前面添加 0:

int a1 = 65;   // literals are by default base10
int a2 = 0101; // an octal literal in Java is preceded by a 0
int a3 = 'A';
System.out.println(a1 == a2 && a2 == a3);

以上将输出true

如果你想在你的例子中,你可以通过八进制文字设置n或将八进制String解析为int,你会得到你期望的结果:

int n = 010; // octal literal equal to decimal 8
int a = 'A' + ('Y' - 'A' + n) % 26;
System.out.println(a);
System.out.println(Integer.toOctalString(a));

输出:

71
107

您还可以解析 n 的八进制 String:

int n = Integer.valueOf("010", 8);

您在这里真正面临的问题是尝试进行 base8 数学运算,但执行 base10 算术(并且您将 n 保留为十进制 8):

int o = 101 + (131 - 101 + 8) % 26;
System.out.println(o);
System.out.println(Integer.toOctalString(o));

Java 将这些文字解释为 base10 表示形式,这肯定会导致:

113
161

另一方面,如果您使用八进制文字并执行相同的操作...

int o = 0101 + (0131 - 0101 + 010) % 26;
System.out.println(o);
System.out.println(Integer.toOctalString(o));

输出:

71
107

关于java - 字符算术 --- 基数 8 与基数 10,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21542462/

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