【问题标题】:Character Arithmetic --- Base 8 vs Base 10字符算术 --- Base 8 vs Base 10
【发布时间】:2014-02-04 03:33:38
【问题描述】:

在进行字符算术时,规则是以 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 (基数 8)

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

【问题讨论】:

  • @SotiriosDelimanolis 解决了吗?
  • 我真的很困惑。为什么要处理八进制?除此之外......您在 base8 中进行数学运算的代码在哪里?
  • 没有。默认情况下,一切都是base10。 'A' == 65(至少如果您使用的是保留 US-ASCII 值的字符集)。你的代码是(65 + (<some_val> - 65 + n) % 26)
  • @JessicaM.,数值不是任何基础。一个数字就是它。只有数字的字符串表示形式才有基数。
  • @JessicaM.:不,默认情况下,base 8 中没有任何内容。几乎所有你需要做的事情,包括处理角色,都在 base 8 中。Base 8 在这里完全是一个红鲱鱼:忘记它的一切。

标签: java unicode character ascii character-properties


【解决方案1】:

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

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

当谈到 Java 中的 literals 时,默认情况下它们被解释为 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

您还可以将八进制 String 解析为 n

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

【讨论】:

  • 非常感谢。我不知道我为什么这么困惑。
【解决方案2】:

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

尝试以 8 为基数的计算
... % 32(base 8)

而不是 26(以 8 为底)。

【讨论】:

  • 这正是问题所在。我花了一段时间才掌握这么简单的概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2011-01-24
相关资源
最近更新 更多