为什么大多数语言不允许二进制数?

时间:2009-01-27 15:04:25

标签: language-agnostic binary numbers

为什么大多数计算机编程语言都不允许二进制数用作十进制或十六进制?

  • 在VB.NET中,您可以编写十六进制数字,例如& H4
  • 在C中你可以写一个十六进制数字,如0x04

为什么不允许二进制数?

  • &安培; B010101
  • 0y1010

奖励积分!... 做什么语言允许二进制数?


修改

哇! - 所以大多数人认为这是因为简洁和可怜的旧“浪潮”认为这是由于二进制表示的技术方面。

20 个答案:

答案 0 :(得分:34)

因为十六进制(很少是八进制)文字更紧凑,使用它们的人通常可以比十六进制数更快地在十六进制和二进制之间进行转换。

Python 2.6+允许二进制文字,Ruby和Java 7也是如此,您可以使用下划线使字节边界明显。例如,十六进制值0x1b2a现在可以写为0b00011011_00101010

答案 1 :(得分:10)

在C ++中,支持user defined literals个二进制数的0x,我不确定它是否会成为标准的一部分,但最坏的情况下你可以自己启用它

int operator "" _B(int i);

assert( 1010_B == 10);

答案 2 :(得分:8)

为了使位表示有意义,您需要知道如何解释它。 您需要指定您正在使用的二进制数字的类型(有符号/无符号,二进制补码,一元恭维,有符号幅度)。

我使用过的唯一正确支持二进制数的语言是硬件描述语言(Verilog,VHDL等)。它们都有严格(通常是令人困惑的)定义如何处理二进制数字。

答案 3 :(得分:6)

请参阅perldoc perlnumber

NAME
   perlnumber - semantics of numbers and numeric operations in Perl

SYNOPSIS
       $n = 1234;              # decimal integer
       $n = 0b1110011;         # binary integer
       $n = 01234;             # octal integer
       $n = 0x1234;            # hexadecimal integer
       $n = 12.34e-56;         # exponential notation
       $n = "-12.34e56";       # number specified as a string
       $n = "1234";            # number specified as a string

答案 4 :(得分:5)

稍微偏离主题,但较新版本的GCC添加了一个允许二进制文字的C扩展。因此,如果您只使用GCC进行编译,则可以使用它们。文件记录是here

答案 5 :(得分:3)

Common Lisp允许二进制数,使用#b ...(位从最高到最低2的幂)。大多数情况下,使用十六进制数字至少同样方便(通过使用#x ...),因为在头脑中十六进制数和二进制数之间进行转换相当容易。

答案 6 :(得分:2)

D使用语法0 [bB] [01] +支持二进制文字,例如0b1001。它还允许在数字文字中嵌入_字符,以便更容易阅读。

答案 7 :(得分:2)

十六进制和八进制只是编写二进制文件的较短方法。你真的想要在你的代码中定义一个64个字符长的常量吗?

答案 8 :(得分:2)

虽然C只有8,10或16的本机支持作为基础,但编写预处理器宏实际上并不难,这使得编写8位二进制数字非常简单和可读:

#define BIN(d7,d6,d5,d4, d3,d2,d1,d0)                      \
(                                                          \
    ((d7)<<7) + ((d6)<<6) + ((d5)<<5) + ((d4)<<4) +        \
    ((d3)<<3) + ((d2)<<2) + ((d1)<<1) + ((d0)<<0)          \
)
int my_mask = BIN(1,1,1,0, 0,0,0,0);

这也适用于C ++。

答案 9 :(得分:2)

Java 7现在支持二进制文字。所以你可以简单地写0b110101。关于此功能的文档不多。我能找到的唯一参考是here

答案 10 :(得分:1)

普遍的看法认为长字符串的二进制数字,例如int的32位,对于人们来说太难以方便地解析和操作。十六进制通常被认为更容易,但我没有使用足够的优势。

Ruby,如前所述,试图通过允许_被大量插入文字中来解决这个问题,例如:

irb(main):005:0> 1111_0111_1111_1111_0011_1100
=> 111101111111111100111100

答案 11 :(得分:1)

记录,并回答:

  

奖励积分!...哪些语言允许二进制数?

Specman(又名e)允许二进制数。虽然说实话,但它并不是一种通用的语言。

答案 12 :(得分:1)

每种语言都应该支持二进制文字。我疯了没有它们!

  

奖励积分!...哪些语言允许二进制数?

Icon允许任何基础中的文字从2到16,可能最多36(我的内存变暗)。

答案 13 :(得分:0)

Forth始终允许使用任何基数(当然是CPU的大小限制)。想要使用二进制文件:2 BASE !八进制:8 BASE !等。想与时间一起工作吗? 60 BASE !这些示例都是从基数设置为10十进制输入的。要更改基数,您必须表示当前数字基数所需的基数。如果是二进制,并且您想切换回十进制,那么1010 BASE !将起作用。大多数Forth实现具有转移到共同基础的“单词”,例如, DECIMALHEXOCTALBINARY

答案 14 :(得分:0)

虽然它不直接,但大多数语言也可以解析字符串。 Java可以使用方法将“10101000”转换为int。

这不是有效的或任何东西......只是说它就在那里。如果它是在静态初始化块中完成的,它甚至可以在编译时完成,具体取决于编译器。

如果你对二进制有任何好处,即使是短数字也很容易看到0x3c为4个后跟2个零,而即使是那么短的二进制数也会是0b111100这可能会让你的眼睛受伤之前你确定了它的数量。

0xff9f正好是4 + 4 + 1个,2个零和5个(看到位掩码很明显)。试图计算0b1111111110011111更令人恼火。

我认为问题可能是语言设计师总是以十六进制/八进制/二进制/无论什么方式进行深入研究,并且只是这样思考。如果你经验不足,我完全可以看到这些转换不会那么明显。

嘿,这让我想起了我在考虑基本转换时想出的一些东西。一个序列 - 我认为没有人能想出“下一个数字”,但实际上有一个人做了,所以它是可以解决的。试一试:

10 11 12 13 14 15 16 21 23 31 111 ?

编辑: 顺便说一句,这个序列可以通过在大多数语言中将序列号输入单个内置函数来创建(肯定是Java)。

答案 15 :(得分:0)

在Pop-11中,您可以使用由数字(2到32)+冒号组成的前缀来表示基数,例如

2:11111111 = 255

3:11111111 = 3280

16:11111111 = 286331153

31:11111111 = 28429701248

32:11111111 = 35468117025

答案 16 :(得分:0)

十六进制只是不那么冗长,可以表达任何二进制数字。

如果你真的想要它,那么Ruby对二进制数字有很好的支持。 0b11011等。

答案 17 :(得分:0)

在Smalltalk中它就像2r1010。您可以使用最多36个左右的任何基础。

答案 18 :(得分:0)

我希望语言设计者没有看到足够的需要添加二进制数。在处理标志或位掩码时,平均编码器可以解析十六进制和二进制。有些语言支持二进制作为表示,这很好,但我认为平均来说它很少使用。虽然二进制文件 - 如果在C,C ++,Java,C#中可用,可能会比八进制使用更多!

答案 19 :(得分:0)

从可读性和可用性的角度来看,十六进制表示似乎是定义二进制数的更好方法。他们不添加它的事实可能更多是用户需要的技术限制。