0x
16進数と8進数にはプレフィックスを使用0
しているので、2進数に対してできることはありますか?
b
サフィックスを試しましたが、 GCCでは許可されませんでした。
エラー:整数定数の無効なサフィックス「b」
出来ますか?
標準Cは2進定数を定義していません。ただし、GNU C拡張機能があります(人気のあるコンパイラーの中で、clangもそれを適応させます):0b
または0B
プレフィックス:
int foo = 0b1010;
標準のCを使い続けたい場合は、オプションがあります。マクロと関数を組み合わせて、ほぼ読み取り可能な「バイナリ定数」機能を作成できます。
#define B(x) S_to_binary_(#x)
static inline unsigned long long S_to_binary_(const char *s)
{
unsigned long long i = 0;
while (*s) {
i <<= 1;
i += *s++ - '0';
}
return i;
}
そして、次のように使用できます。
int foo = B(1010);
コンパイラの大幅な最適化をオンにすると、コンパイラは関数呼び出しを完全に排除するか(定数畳み込み)、少なくともインライン化する可能性が高いため、パフォーマンスの問題になることはありません。
証拠:
次のコード:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#define B(x) S_to_binary_(#x)
static inline unsigned long long S_to_binary_(const char *s)
{
unsigned long long i = 0;
while (*s) {
i <<= 1;
i += *s++ - '0';
}
return i;
}
int main()
{
int foo = B(001100101);
printf("%d\n", foo);
return 0;
}
を使用してコンパイルさclang -o baz.S baz.c -Wall -O3 -S
れ、次のアセンブリが生成されました。
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main: ## @main
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp2:
.cfi_def_cfa_offset 16
Ltmp3:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp4:
.cfi_def_cfa_register %rbp
leaq L_.str1(%rip), %rdi
movl $101, %esi ## <= This line!
xorb %al, %al
callq _printf
xorl %eax, %eax
popq %rbp
ret
.cfi_endproc
.section __TEXT,__cstring,cstring_literals
L_.str1: ## @.str1
.asciz "%d\n"
.subsections_via_symbols
したがってclang
、関数の呼び出しを完全に排除し、その戻り値を。に置き換えました101
。きちんとね?
Use BOOST_BINARY (Yes, you can use it in C).
#include <boost/utility/binary.hpp>
...
int bin = BOOST_BINARY(110101);
This macro is expanded to an octal literal during preprocessing.