自分のお店を開く時の心構えとは? >>

ある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を作れそうな気はしますがよくわかりません。
説明が分かりにくくて申し訳ありませんが、どなたか教えていただけないでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

#2 です.


どこが「よくわからない」んでしょうか. 実際に試せばわかると思うんだけどなぁ.
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/01/07 00:30

や, #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];
で求める方が簡単.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
うーん、すみません。よくわかりません。

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

お礼日時:2008/01/04 17:33

#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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/01/04 14:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング