[解決済み] Cコードで2進法を書く [重複]。
2022-03-06 23:27:29
質問
を使用しているため
0x
のプレフィックスは16進数、そして
0
8進数ならともかく、2進数ではどうなんでしょう?
を試してみました。
b
というサフィックスがありますが
GCC
はそれを許さなかった。
エラー: 整数定数の接尾辞 "b" が無効です。
可能でしょうか?
どのように解決するのですか?
標準C言語では、バイナリ定数は定義されていません。しかし、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
. すっきりしたでしょ?
関連
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み】組み込み関数「malloc」の暗黙の宣言の非互換性
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み] printf ファミリーを使用して、size_t 変数をポータブルに印刷するにはどうすればよいですか?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] 難読化Cコードコンテスト2006。sykes2.cの解説をお願いします。
-
[解決済み】CやC++でバイナリ・リテラルを使うことはできますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind - strcpyのサイズ1の無効な書き込み
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】警告。この関数ではXが初期化されていない状態で使用される可能性があります。
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】配列型char[]が代入できない [重複]。
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?
-
[解決済み】CやC++でバイナリ・リテラルを使うことはできますか?