- 締切済み
ビット演算を使えば出来ますか?
ある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を作れそうな気はしますがよくわかりません。 説明が分かりにくくて申し訳ありませんが、どなたか教えていただけないでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
#2 です. どこが「よくわからない」んでしょうか. 実際に試せばわかると思うんだけどなぁ.
- Tacosan
- ベストアンサー率23% (3656/15482)
や, #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]; で求める方が簡単.
お礼
ご回答ありがとうございます。 うーん、すみません。よくわかりません。 data1にはどんな値が入ってくるのかはわかりません。 ですのでchar型の変数 data1 = 0x51(01010001)を data2=0x33(00110011), data3=0x03[00000011]というふうに単純に展開する方法を教えていただけないのでしょうか?
- yaemon_2006
- ベストアンサー率22% (50/220)
#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; }
お礼
ご回答ありがとうございます。 できればscanf()、printf()などは使わずに処理したいんです。 説明不足ですみません。
お礼
自己解決しました。 いろいろとありがとうございました。