ページ 11

ビット単位のシフト演算

Posted: 2009年11月15日(日) 00:30
by どころてん
#include <stdio.h>
int main(void)
{
unsigned all_data,data1;
scanf("%x",&all_data);

data1=(all_data>>8)&0xff;

printf("%x \n",data1);

return 0;
}

このプログラムですが、&0xffって何ですか??
何かのおまじないですか??

Re:ビット単位のシフト演算

Posted: 2009年11月15日(日) 00:34
by たかぎ
左辺と0xffのビットANDです。

Re:ビット単位のシフト演算

Posted: 2009年11月15日(日) 01:01
by どころてん
すいません、言葉が足らなさすぎました。
&0xffってこのプログラムではどんな役割をしているんですか?

Re:ビット単位のシフト演算

Posted: 2009年11月15日(日) 01:12
by たかぎ
> &0xffってこのプログラムではどんな役割をしているんですか?

下8ビットを取り出しています。

Re:ビット単位のシフト演算

Posted: 2009年11月15日(日) 02:10
by どころてん
> 下8ビットを取り出しています。
何で下8ビットを取り出すってわかるんでしょうか?
何か定義に基づいてるのですか?
それともそのまま覚えたほうがいいのでしょうか??

Re:ビット単位のシフト演算

Posted: 2009年11月15日(日) 02:13
by たかぎ
> 何で下8ビットを取り出すってわかるんでしょうか?

0xffというのは、2進数になおすと、11111111のように1が8つ並びます。
それと他の値とのビットANDを計算すると、1のところ(つまり下位8ビット)はそのままで、9ビット目から上は全部0になります。
結果として、下位8ビットだけが取り出せます。

Re:ビット単位のシフト演算

Posted: 2009年11月15日(日) 08:11
by conio
>>何で下8ビットを取り出すってわかるんでしょうか?
>>何か定義に基づいてるのですか?
16進数や、2進数にするとどのようなビットの並びになるか、等は分かりますか?

もし分からなければ、解説しているサイトなどもありますので、見てみるといいかもしれません。
16進数、2進数なんかで検索すると 色々と出てきます。
------------------------------------------------------
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/bdh.html
http://www.geocities.jp/cwqnx949/xshinsuu/
------------------------------------------------------

Re:ビット単位のシフト演算

Posted: 2009年11月15日(日) 11:38
by pp
&0xffをint *p=&a;などの&aのようなアドレス参照を意味する&と勘違いされていませんか?
data1=(all_data>>8)&0xff;は(all_data>>8)の計算結果と0xff(10進数でいうところの255)を
&演算(AND演算)してその結果をdata1に代入するという式です
この式にある&は+や*と同じ左辺と右辺を使って処理をする演算子でアドレス参照を意味する&ではありません