Разделитель, чтобы бинарные литералы выглядели чище

Я пытаюсь писать двоичные литералы в более чистом формате.

Я понимаю, что для целочисленных литералов можно сделать следующее:

int x = 1234_5678_9999;

Я предполагал, что это будет работать для двоичных литералов, поэтому я попробовал:

uint32_t branch_bitmask = 0b0000_1111_0000_0000_0000_0000_0000_0000;

Что дает мне недопустимую ошибку суффикса для всего, что находится за первым символом подчеркивания.

Есть ли альтернатива подчеркиванию, которая позволила бы мне написать двоичный литерал более чистым способом, чем просто:

uint32_t branch_bitmask = 0b00001111000000000000000000000000;

person M S    schedule 30.05.2020    source источник
comment
Я знаю, что в С++ есть разделитель цифр ', но я не думаю, что есть что-то подобное для стандартного C, может быть расширение GCC, но оно не будет переносимым на все компиляторы.   -  person Toothless204    schedule 30.05.2020
comment
не на языке программирования c. единственный способ - преобразовать его в строку (например, с помощью функции itoa()), а затем вставить разделители в выходную строку.   -  person nor    schedule 30.05.2020
comment
В конце концов, я решил заменить бинарный литерал целым числом и поставить «более чистый», но недопустимый двоичный литерал сразу после (прокомментировано).   -  person M S    schedule 31.05.2020


Ответы (1)


Если у вас всегда одно и то же количество бит (32 в вашем примере), вы можете #define макрос выглядит примерно так:

#define BITS32(b1,b2,b3,b4,b5,b6,b7,b8) ( \
  ((b1) << 28) + \
  ((b2) << 24) + \
  ((b3) << 20) + \
  ((b4) << 16) + \
  ((b5) << 12) + \
  ((b6) << 8) + \
  ((b7) << 4) + \
  (b8))

а затем назовите это так:

uint32_t branch_bitmask = BITS32(0b0000,0b1111,0b0000,0b0000,0b0000,0b0000,0b0000,0b0000);

или вы можете пойти дальше и использовать ## в макросе, чтобы добавить 0b.

Но простым ответом для меня всегда было использование шестнадцатеричной системы счисления, поскольку одна шестнадцатеричная цифра — это 4 бита.

person Brecht Sanders    schedule 31.05.2020