いつもお世話になります。
ビット演算について教えて下さい。
unsigned char buf1[1]=0x5a
unsigned char buf1[2]=0x04
unsigned char buf1[3]=0x38
5a0438(16)を3バイトの値を12ビットずつの整数で得るにはどうしたらいいのでしょうか?
2進数表記では、
5A | 04 | 38
01011010 | 00000100 | 00111000
12ビットずつとは、
010110100000
010000111000
と区分し、10進数の整数値で得たいです。どのようにすればよいでしょうか?
また、0x5Aなどの16進数を2進数のビットで考えるときに、
01011010を下位4ビットを10進数整数を得るにはどうしたらよいのでしょうか?
上記2点、どうぞよろしくお願い致します。
No.2ベストアンサー
- 回答日時:
論理演算とビットシフトの組み合わせてで実現できます。
とその前に、10進数整数を得ると書かれてますがコンピュータの整数値は基本的に2進数で内部処理されます。
10進数は表示時にprintf関数がワザワザ10進数に変換しているのであって、内部では2進数な事を忘れないでください。
intもshortもcharも全て2進数(binary)です。
>unsigned char buf1[1]=0x5a
>unsigned char buf1[2]=0x04
>unsigned char buf1[3]=0x38
short uppper12bit = (buf[1] << 4) | (buf[2] >> 4);
short under12bit = ((buf[2]&0x0f)<<8) | buf[3];
printf("上12bit=%d 下12bit=%d\n",uppper12bit,under12bit);
>また、0x5Aなどの16進数を2進数のビットで考えるときに、01011010を下位4ビットを10進数整数を得るにはどうしたらよいのでしょうか?
unsigned char under4bit = buf[1] & 0x0f;
printf("上4bit=%d\n",under4bit);
16進数も2進数と書き方が違うだけで同じものです。これといった複雑なことが行われているわけではありません。C言語は16進数で代用できるので2進数が言語上存在しないのです。
No.3
- 回答日時:
php504 さんの回答で気になったのは、格上げがあるのでキャストの必要がないだろうという点と、シフトとビットアンドの優先度の違いですね^^;
the-ai さんの質問で気になったのは、添え字は 0 からにしたほうが自然だろうという点と、バイト順を意識してほんとにしたいことをしているのか、という点です^^ ちょっとした老婆心ですが(笑)
No.1
- 回答日時:
単に3バイト(24ビット)を12ビットに分けるだけなら
(unsigned short)buf[1] << 4 | buf[2] >> 4;
buf[1]を4ビット左へシフトして空いた4ビット分にbuf[2]を右に4ビットシフトした値を入れる
(unsigned short)buf[2] & 0x0F << 8 | buf[3];
buf[2]の下位4ビットを左に8ビットシフトして空いた8ビットにbuf[3]を入れる
下位4ビットだけにしたいなら
0x5A & 0x0F;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 以下の問題が分かりません。 8ビット浮動小数点数が、最上位ビットから順に符号1ビット、指数部3ビット 4 2023/07/22 16:06
- 数学 「FFTの基本は、DFTはサンプル数Nが偶数なら 2つのDFTに分解できるということ。 分解するとD 3 2022/03/31 21:01
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
- 情報処理技術者・Microsoft認定資格 情報技術の問題についてです。 10進数の−36を以下のような16ビットの浮動小数点表示にするといくつ 3 2022/05/21 19:53
- 計算機科学 2進数の計算について 2進数の値は全て8ビットで負数は2の補数形式とする。結果が8ビットで表現出来な 3 2023/07/22 14:08
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- 工学 疑似乱数生成器 3 2023/01/05 02:06
- 計算機科学 20個の量子ビットからなる量子計算機はおおよそいくつの状態を同時に表現できるか?10x の形で表現し 2 2022/12/27 14:52
- Oracle ビットで表せる数値について 3 2022/09/12 16:37
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
int main()の・・・
-
テキストデータをそのままバイ...
-
配列をnビットシフトする
-
atoi( ) の反対をやりたい
-
charからLPTSTRへの変換方法
-
Linuxでフォルダ内全ファイル名...
-
C言語のfor文です。 繰り返しの...
-
間接参照のレベルが異なっています
-
ワイルドカードを用いた文字列検索
-
制御の方法
-
TCP/IP通信型大文字・小文字変...
-
文字列ポインタを結合
-
CStringをwchar_tに変換したい
-
charでの計算?
-
C言語、リダイレクト
-
文字列から空白を取り除きたい...
-
干支のプログラム
-
C言語の入力した文字を反転させ...
-
C#からC言語で作成したDLLに文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
str系関数を使わずに二つの文字...
-
間接操作のレベルとは
-
int main()の・・・
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
switch文で文字を比較すること...
-
テキストデータをそのままバイ...
-
Win32APIでのエディットボック...
-
double型の値をchar配列に変換...
-
干支のプログラム
-
コンパイルエラー invalid ope...
-
間接参照のレベルが異なっています
おすすめ情報