0

在进行字符算术时,您执行以 10 为底还是以 8 为底的计算的规则是什么?我的书说 'A' = 101 in base 8 或 65 base 10 但是当我将 base 8 中的字符值插入到示例中时,我的书给出了关于说明这一点的示例,我得到了一些有趣的结果。下面的代码是我书中尝试查找新字符的 Ceaser Cipher 示例。如果我尝试转换 'Y' 并移动 8 个点以找到一个新字符,并且如果 ch = 'Y' 和 n = 8 我期望得到字符'G'。

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

数学运算结果为
65 + (89 - 65 + 8) % 26 = 71 (base 10)
101 + (131 - 101 + 8) % 26 = 113 (base 8)

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

4

2 回答 2

1

认为您的问题是模函数在两种情况下都不能使用“26”——26(base 8)是十进制的 22;英文字母表中有 32 个(以 8 为基数)字符。尝试使用 8 进制计算

... % 32(base 8)

而不是 26(以 8 为基数)。

于 2014-02-04T03:52:39.363 回答
1

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

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

您还可以解析八进制Stringn

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

您在这里真正面临的问题是尝试进行 base8 数学运算,但执行base10算术(并且您保留n为 decimal 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

于 2014-02-04T04:26:08.293 回答