Почему большинство языков не допускают двоичные числа? - PullRequest
17 голосов
/ 27 января 2009

Почему большинство языков программирования не позволяют использовать двоичные числа, такие как десятичные или шестнадцатеричные?

  • В VB.NET вы можете написать шестнадцатеричное число, например & H4
  • В C вы можете написать шестнадцатеричное число, например 0x04

Почему бы не разрешить двоичные числа?

  • & B010101
  • 0y1010

Бонусные баллы! ... На каких языках разрешено разрешать двоичные числа?


Редактировать

Вау! - Таким образом, большинство думает, что это из-за краткости, а старые бедные «волны» думают, что это из-за технических аспектов двоичного представления.

Ответы [ 20 ]

34 голосов
/ 27 января 2009

Поскольку шестнадцатеричные (и редко восьмеричные) литералы более компактны, и люди, использующие их, обычно могут быстрее преобразовать шестнадцатеричное в двоичное, чем расшифровывать двоичное число.

Python 2.6 + допускает двоичные литералы, как и Ruby и Java 7 , где вы можете использовать подчеркивание, чтобы сделать границы байтов очевидными. Например, шестнадцатеричное значение 0x1b2a теперь можно записать как 0b00011011_00101010.

10 голосов
/ 27 января 2009

В C ++ 0x с пользовательскими литералами будут поддерживаться двоичные числа, я не уверен, будет ли это частью стандарта, но в худшем случае вы сможете включить его самостоятельно

int operator "" _B(int i);

assert( 1010_B == 10);
8 голосов
/ 27 января 2009

Чтобы представление битов было значимым, вам нужно знать, как его интерпретировать. Вам нужно будет указать тип используемого вами двоичного числа (со знаком / без знака, с двойным комплиментом, с одним комплементом, со звездной величиной).

Единственными языками, которые я когда-либо использовал, которые должным образом поддерживают двоичные числа, являются языки описания оборудования (Verilog, VHDL и тому подобное). Все они имеют строгие (и часто путающие) определения того, как обрабатываются числа, введенные в двоичном формате.

6 голосов
/ 27 января 2009

См. 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
5 голосов
/ 27 января 2009

Немного не по теме, но в более новых версиях GCC добавлено расширение C, которое допускает двоичные литералы. Так что, если вы когда-либо компилируете только с GCC, вы можете использовать их. Документация здесь .

3 голосов
/ 27 января 2009

Common Lisp допускает двоичные числа, используя #b ... (биты идут от старшей к младшей степени 2). В большинстве случаев, хотя бы так же удобно использовать шестнадцатеричные числа (используя #x ...), так как довольно легко конвертировать шестнадцатеричные и двоичные числа в вашей голове.

2 голосов
/ 27 января 2009

D поддерживает двоичные литералы, используя синтаксис 0 [bB] [01] +, например, 0b1001. Он также позволяет встраивать символы _ в числовые литералы, чтобы их было легче читать.

2 голосов
/ 29 октября 2009

Java 7 теперь поддерживает двоичные литералы. Таким образом, вы можете просто написать 0b110101. Существует не так много документации по этой функции. Единственная ссылка, которую я смог найти, это здесь .

2 голосов
/ 27 января 2009

Шестнадцатеричный и восьмеричный - просто более короткие способы записи двоичного кода. Вы действительно хотите, чтобы в вашем коде была определена длинная константа длиной 64 символа?

2 голосов
/ 15 декабря 2009

В то время как 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 ++.

...