45

0x16進数と8進数にはプレフィックスを使用0しているので、2進数に対してできることはありますか?

bサフィックスを試しましたが、 GCCでは許可されませんでした。

エラー:整数定数の無効なサフィックス「b」

出来ますか?

4

3 に答える 3

75

標準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。きちんとね?

于 2013-02-27T14:10:20.217 に答える
15

0bのようにあなたの文字通りの接頭辞

int i = 0b11111111;

ここを参照してください。

于 2013-02-27T14:10:03.983 に答える
7

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.

于 2013-02-27T16:21:02.113 に答える