C言語で10進数と2進数,8進数,16進数の相互変換を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
10進数と2進数の相互変換
10進数と2進数を相互変換するコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #define BIN_BITS 32 #define BIN_BIT_MASK 0x1 #define BIN_BIT_SHIFT 1 void dec2bin(int bin[BIN_BITS], int a) { int i; unsigned int b = a; for (i = BIN_BITS - 1; i >= 0; i--) { bin[i] = b & BIN_BIT_MASK; b >>= BIN_BIT_SHIFT; } } int bin2dec(int bin[BIN_BITS]) { int i; int ret = 0; for (i = BIN_BITS - 1; i >= 0; i--) { ret |= (bin[i] & BIN_BIT_MASK) << (BIN_BITS - 1 - i); } return ret; } void print_bin(int bin[BIN_BITS]) { int i; printf("bin: "); for (i = 0; i < BIN_BITS; i++) { printf("%d", bin[i]); if ((i & 0x3) == 0x3) { printf(" "); } } printf("\n"); } int main(void) { int a, b; int bin[BIN_BITS]; printf("Please input an integer: "); scanf("%d", &a); printf("a = %d\n", a); dec2bin(bin, a); print_bin(bin); b = bin2dec(bin); printf("b = %d\n", b); return 0; } |
実行結果は以下になります.
3行目の行末で10進数の数値「123」と入力し,その値を10進数で表示します(4行目).
次に,10進数を2進数に変換して表示します(5行目).
最後に,2進数を10進数に変換して表示します(6行目).
1 2 3 4 5 6 |
$ gcc dec2bin.c $ a.out Please input an integer: 123 a = 123 bin: 0000 0000 0000 0000 0000 0000 0111 1011 b = 123 |
10進数と8進数の相互変換
10進数と8進数を相互変換するコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #define OCT_BITS 11 #define OCT_BIT_MASK 0x7 #define OCT_BIT_SHIFT 3 void dec2oct(int oct[OCT_BITS], int a) { int i; unsigned int b = a; for (i = OCT_BITS - 1; i >= 0; i--) { oct[i] = b & OCT_BIT_MASK; b >>= OCT_BIT_SHIFT; } } int oct2dec(int oct[OCT_BITS]) { int i; int ret = 0; for (i = OCT_BITS - 1; i >= 0; i--) { ret |= (oct[i] & OCT_BIT_MASK) << OCT_BIT_SHIFT * (OCT_BITS - 1 - i); } return ret; } void print_oct(int oct[OCT_BITS]) { int i; printf("oct: "); for (i = 0; i < OCT_BITS; i++) { if ((i & 0x3) == 0x3) { printf(" "); } printf("%o", oct[i]); } printf("\n"); } int main(void) { int a, b; int oct[OCT_BITS]; printf("Please input an integer: "); scanf("%d", &a); printf("a = 0%o\n", a); dec2oct(oct, a); print_oct(oct); b = oct2dec(oct); printf("b = 0%o\n", b); return 0; } |
実行結果は以下になります.
同様に10進数と8進数を相互変換します.
1 2 3 4 5 6 |
$ gcc dec2oct.c $ a.out Please input an integer: 123 a = 0173 oct: 000 0000 0173 b = 0173 |
10進数と16進数の相互変換
10進数と16進数を相互変換するコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #define HEX_BITS 8 #define HEX_BIT_MASK 0xf #define HEX_BIT_SHIFT 4 void dec2hex(int hex[HEX_BITS], int a) { int i; unsigned int b = a; for (i = HEX_BITS - 1; i >= 0; i--) { hex[i] = b & HEX_BIT_MASK; b >>= HEX_BIT_SHIFT; } } int hex2dec(int hex[HEX_BITS]) { int i; int ret = 0; for (i = HEX_BITS - 1; i >= 0; i--) { ret |= (hex[i] & HEX_BIT_MASK) << HEX_BIT_SHIFT * (HEX_BITS - 1 - i); } return ret; } void print_hex(int hex[HEX_BITS]) { int i; printf("hex: "); for (i = 0; i < HEX_BITS; i++) { printf("%x", hex[i]); if ((i & 0x3) == 0x3) { printf(" "); } } printf("\n"); } int main(void) { int a, b; int hex[HEX_BITS]; printf("Please input an integer: "); scanf("%d", &a); printf("a = 0x%x\n", a); dec2hex(hex, a); print_hex(hex); b = hex2dec(hex); printf("b = 0x%x\n", b); return 0; } |
実行結果は以下になります.
同様に10進数と16進数を相互変換します.
1 2 3 4 5 6 |
$ gcc dec2hex.c $ a.out Please input an integer: 123 a = 0x7b hex: 0000 007b b = 0x7b |
まとめ
C言語で10進数と2進数,10進数と8進数,10進数と16進数の相互変換を紹介しました.
n進数の変換は,バイナリを表示する時等に有用ですので,使いこなしましょう.
※odコマンドでも利用されています.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!