- ベストアンサー
C言語超初心者・シフト演算の問題で質問です
- 問題集を読んでいて、突然わからない記号が出てきました。18行目、25行目の意味がさっぱりわかりません。
- 自分で調べてみたのですが、左に動くと2倍右に動くと1/2倍というのはどこにも書いてあり、理解できたのですがそれがどうこの問題とつながっていて、回答が1~3まであるのに、0と1で表現するの?
- 25行目の0x3は、16進数かなぁと思うのですが、それが&と組み合わさると・・・??????とか混乱してました・・・GW中にでもご回答いただけたらと思います。よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
それぞれの値を2進数で表示すると( )のようになります。 問1:3 (00 00 00 11) 問2:2 (00 00 00 10) 問3:1 (00 00 00 01) 問4:3 (00 00 00 11) これをそれぞれのビット位置に移動するには 問1:3 (00 00 00 11) 0ビット左シフト 問2:2 (00 00 10 00) 2ビット左シフト 問3:1 (00 01 00 00) 4ビット左シフト 問4:3 (11 00 00 00) 6ビット左シフト のように(問数-1)*2ビットシフトすればいいことになります。 プログラム上では問数は0-3なのでそのまま2倍して大丈夫ですね。 4問を1つにまとめたら 11 01 10 11 になります ここから2問目の答えを取得する場合さっきとは逆に右に(問数-1)*2ビットシフトします 00 11 01 10 このままですと他の問の答えも含んでいるので一番下の2ビットだけにする必要があります。 それには必要な部分だけ1にした数字で & (and)すればOKです。 00 11 01 10 00 00 00 11 (16進数で0x3、10進数でも3なので同じですが) この2個を & すると問2の答えの 00 00 00 10 が求められるわけです。 25行目の0x3はこの数字です
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
絵を使って理解する方がいいかも.... 以下, ans を 8ビットと仮定します. aa, bb, cc, dd を問1~問4 の回答としたときに ans = [dd][cc][bb][aa] と入れたいわけです. すると, 例えば問3 の回答である cc が来たときには ans = [00][00][bb][aa] と入っていて, これを ans = [00][cc][bb][aa] としたいわけです. すると, 「cc を 4ビット左にシフトして or をとればいい」ということがわかります. 問3 ということは i = 2 だから「2*iビット左シフトする」ということになります.
お礼
お返事ありがとうございます! 左にシフトしてorをとることで1つの変数に横一列に保存するのですね。 それとは別に、表示は考えるんですね~~。 ですよね??・_・;
- SAYKA
- ベストアンサー率34% (944/2776)
>16進数かなぁと >18: ans|=(work<<i*2); >25: work=(ans>>(i*2))&0x3; 数の表現の仕方が複数有るだけ。中身は一緒。 現実世界でも有るでしょ。 1時間=60分=1/24日=3600秒 (単位は違うけど指している値は同一) 空白入れると 判りやすくなるんじゃない? 18: ans |= ( work << i * 2 ) ; 25: work = ( ans >> (i*2) ) & 0x3 ;
補足
さっそくのお返事ありがとうございます!! ans=ans|(work<<i*2)だから、問1はans=0|(work<<2)となって、 論理和だから、どちらかが1なら1か、両方0なら0で・・・ workを2ビット左へ移動するということは・・・下位ビットに0が入って・・・ココからが難しいです><;
お礼
へえ~~このプログラムにはこんな深い内容が込められているのですね! なるほど、移動させて&で消すあたり、面白いです☆彡 非常に参考になりました。ありがとうございます!!