• 締切済み

ビット演算を使えば出来ますか?

あるchar型の変数の各ビットを二つずつにして別の変数にしまいたい場合どういうプログラムを作ればいいでしょうか? char型の変数 data1 = 0x51があるとします。 2進数で表すと[01010001] になります。 これを別のchar型の変数に data2=[00110011], data3=[00000011]というふうにしてしまいたいのです。 なにぶん素人なものでうまく説明できませんが各ビットを二つにして横に伸ばすイメージです。 0→00 1→11 となります。 data1=0x33だと[00110011]ですから作りたいデータは data2=[00001111],data3=[00001111]です。 data1=0x12だと[00010010]ですから作りたいデータは data2=[00000011],data3=[00001100]です。 for文とビット演算をつかってdata1からdata2とdata3を作れそうな気はしますがよくわかりません。 説明が分かりにくくて申し訳ありませんが、どなたか教えていただけないでしょうか?

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

#2 です. どこが「よくわからない」んでしょうか. 実際に試せばわかると思うんだけどなぁ.

dora40
質問者

お礼

自己解決しました。 いろいろとありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

や, #1 の回答における scanf, printf は処理には全然関係ないですよ. まあ, こんなの配列使った方がいいような気もするけど. char extend[16] = { 0x00, 0x03, 0x0c, 0x0f, 0x30, 0x33, 0x3c, 0x3f, 0xc0, 0xc3, 0xcc, 0xcf, 0xf0, 0xf3, 0xfc, 0xff }; と「欲しいパターン」を配列でならべておいて, data2 = extend[(data1 >> 4) & 0x0f]; data3 = extend[data1 & 0x0f]; で求める方が簡単.

dora40
質問者

お礼

ご回答ありがとうございます。 うーん、すみません。よくわかりません。 data1にはどんな値が入ってくるのかはわかりません。 ですのでchar型の変数 data1 = 0x51(01010001)を data2=0x33(00110011), data3=0x03[00000011]というふうに単純に展開する方法を教えていただけないのでしょうか?

回答No.1

#include<stdio.h> int main(void) { int n, m = 0; scanf("%d", &n); printf("%x\n", n); m |= (n & 1) | (n & 1) << 1; m |= (n & 2) << 1 | (n & 2) << 2; m |= (n & 4) << 2 | (n & 4) << 3; m |= (n & 8) << 3 | (n & 8) << 4; printf("%x\n", m); return 0; }

dora40
質問者

お礼

ご回答ありがとうございます。 できればscanf()、printf()などは使わずに処理したいんです。 説明不足ですみません。

関連するQ&A

専門家に質問してみよう