ページ 1 / 1
char型の配列をint型の配列に格納する方法
Posted: 2011年8月04日(木) 23:52
by ダイエッター
コード:
【質問内容】
char型の2つの配列2バイトをint型の配列先頭に格納する方法を教えてください。
以下、コードを記載します。
int main()
{
char a[1]={0xf,0xf};
int buf[1]={0x0000,0x1111};
//int buf[0]の先頭2バイトに>a[0]と[1]の2バイトを格納し、buf[0]=0xff00にしたいです。
return 0;
}
よろしくお願いいたします。
Re: char型の配列をint型の配列に格納する方法
Posted: 2011年8月05日(金) 00:06
by box
ダイエッター さんが書きました:コード:
char a[1]={0xf,0xf};
int buf[1]={0x0000,0x1111};
今回の問題を解決する前に、勉強しなければならないことがありそうです。
a[1]
や
buf[1]
と定義した配列では、アクセスできるのは
a[0]
や
buf[0]
だけです。
a[1]
も
buf[1]
も、配列の定義範囲外の領域です。
Re: char型の配列をint型の配列に格納する方法
Posted: 2011年8月05日(金) 00:19
by ダイエッター
すみません。勉強不足でした。
以下でしょうか?
int main()
{
char a[2];
a[0]=0xf;
a[1]=0xf;
int buf[2]={0x0000,0x1111};
//int buf[0]の先頭2バイトに>a[0]と[1]の2バイトを格納し、buf[0]=0xff00にしたいです。
return 0;
}
Re: char型の配列をint型の配列に格納する方法
Posted: 2011年8月05日(金) 02:47
by bitter_fox
ダイエッター さんが書きました:
char a[2];
a[0]=0xf;
a[1]=0xf;
int buf[2]={0x0000,0x1111};
//int buf[0]の先頭2バイトに>a[0]と[1]の2バイトを格納し、buf[0]=0xff00にしたいです。
まず、1バイトというのは多くの場合8ビットであり、2進数で表すと0から11111111までで16進数だと0~FFになります。
仮にダイエッターさんの環境がそうであるならば、a[0]およびa[1]を16進数で厳密に表記すれば0Fとなります。
そして、int型が4バイトと仮定すると、int型の数値を16進数で表した場合は最大で8桁になり、先頭2バイトにa[0]とa[1]を格納した場合は0F0F0000となるべきです。
また、上に基づいたプログラムを作成するには、
コード:
0 :Fourth Third Second First
1 :00000000 00000000 00000000 00000000
2 : 00001111 a[0](0F)
3 :00001111 <<<<<<<< <<<<<<<< <<<<<<<< a[0](0F)を3バイト左にビットシフトした結果
5 : 00001111 a[1](0F)
6 :00000000 00001111 <<<<<<<< <<<<<<<< a[1](0F)を2バイト左にビットシフトした結果
7 :00001111 00001111 00000000 00000000 3と6を合わせた結果
のような処理を行います。
3, 6で行っているビットシフトについては次を参考にしてください。
http://wisdom.sakura.ne.jp/programming/cs/cs7.html
7の処理は足し算で行っても良いですし、OR演算を用いても構いません。
http://www9.plala.or.jp/sgwr-t/c/sec14.html
より厳密なプログラムを組むのであれば3や6の時に不必要なビットを0に下げる処理を加える必要があります。
コード:
0 :Fourth Third Second First
1 :00000000 00000000 00000000 00000000
2 : 11110000 F0(char型)
3 :11111111 11110000 <<<<<<<< <<<<<<<< F0を2バイト左にビットシフトした結果
4 :00000000 11111111 00000000 00000000 00FF0000
5 :00000000 11110000 00000000 00000000 3 & 4
4':00000000 00000000 00000000 11111111 FF(int型)
:00000000 11111111 <<<<<<<< <<<<<<<< FFを2バイト左にビットシフトした結果
5の処理はAND演算を用いてください。
なぜこの処理が必要になるかというと0xF0(char型)は負数でこれをシフトした結果も負数になり7の処理に支障が生じるためです。