平成23年秋期 問1
広告
今度こそ受かりたいさん
(No.1)
この問題がわかりません。
右シフト2の乗数で割る。
左シフト2の乗数かける。
なぜmod256をする必要があるのでしょうか?
右シフト2の乗数で割る。
左シフト2の乗数かける。
なぜmod256をする必要があるのでしょうか?
2023.06.08 22:13
今度こそ受かりたいさん
(No.2)
boyonboyonさん
★AP シルバーマイスター
(No.3)
XXXXXXXXYYYYYYYYを
YYYYYYYYXXXXXXXXにするので、
XXXXXXXXYYYYYYYY div 256 = 00000000XXXXXXXX (右に8ビットシフトと同じ)
XXXXXXXXYYYYYYYY mod 256 = 00000000YYYYYYYY
に256をかけると YYYYYYYY00000000 (左に8ビットシフトと同じ)
XXXXXXXXYYYYYYYY * 256 をいきなりやるとオーバーフローしてしまうので予防のため mod 256していると思います。
YYYYYYYY00000000+00000000XXXXXXXX=YYYYYYYYXXXXXXXX
で上位8ビットと下位8ビットが入れ替わります。
YYYYYYYYXXXXXXXXにするので、
XXXXXXXXYYYYYYYY div 256 = 00000000XXXXXXXX (右に8ビットシフトと同じ)
XXXXXXXXYYYYYYYY mod 256 = 00000000YYYYYYYY
に256をかけると YYYYYYYY00000000 (左に8ビットシフトと同じ)
XXXXXXXXYYYYYYYY * 256 をいきなりやるとオーバーフローしてしまうので予防のため mod 256していると思います。
YYYYYYYY00000000+00000000XXXXXXXX=YYYYYYYYXXXXXXXX
で上位8ビットと下位8ビットが入れ替わります。
2023.06.08 23:00
Howitzerさん
(No.4)
問題ではデータが16ビットだと言っていますが、
変数(もしくはレジスタ)のサイズには言及がないです。
16ビット変数/レジスタで考えるとオバーフローしてくれるので mod 256 は不要です。
しかし、例えば32ビット変数/レジスタで考えると....
xが HHHHHHHHLLLLLLLL のとき、mod256 なしでは
HHHHHHHHLLLLLLLLHHHHHHHH になってしまいます。
変数(もしくはレジスタ)のサイズには言及がないです。
16ビット変数/レジスタで考えるとオバーフローしてくれるので mod 256 は不要です。
しかし、例えば32ビット変数/レジスタで考えると....
xが HHHHHHHHLLLLLLLL のとき、mod256 なしでは
HHHHHHHHLLLLLLLLHHHHHHHH になってしまいます。
2023.06.09 09:31
boyonboyonさん
★AP シルバーマイスター
(No.5)
>Howitzerさん
的確なご指摘ありがとうございます。
オーバーフローしては駄目だと思っていました。
mod 256は、下位8ビットだけを取り出すためですね。
勉強になりました。
2023.06.09 11:39
今度こそ受かりたいさん
(No.6)
ありがとうございました。
mod256する理由がわかりました。
そもそも論で申し訳ないのですが、
XXXXXXXXYYYYYYYY mod 256 =00000000YYYYYYYY
256で割ると下位8ビットのみ残る理由がわかっていません。教えていただけると助かります。
mod256する理由がわかりました。
そもそも論で申し訳ないのですが、
XXXXXXXXYYYYYYYY mod 256 =00000000YYYYYYYY
256で割ると下位8ビットのみ残る理由がわかっていません。教えていただけると助かります。
2023.06.09 12:19
Howitzerさん
(No.7)
今度こそ受かりたいさん
mod は割り算ではなく、割り算の余りを求める演算子です。
割り算を A=Bq+r とすると、割り算の結果(商)は q で、Modの結果は r です。
XXXXXXXXYYYYYYYY のうち X の部分は256の倍数なので、256で割って割り切れます。
Y の部分は256で割ったときの余りに相当します。(余りなので、0~255に収まります。)
そのため 256でModすることで、下位8ビット(0~255)が残ります。
例えば mod4 なら下位2ビットが得られます。
0~10を4で割り算して余りを調べると0~3が循環して
結果的に下位3ビットが得られることがわかると思います。
※Excelの関数にもMODがあります。
boyonboyonさん
boyonboyonさんのオーバーフローの書き込みを読んでひらめきました。
mod は割り算ではなく、割り算の余りを求める演算子です。
割り算を A=Bq+r とすると、割り算の結果(商)は q で、Modの結果は r です。
XXXXXXXXYYYYYYYY のうち X の部分は256の倍数なので、256で割って割り切れます。
Y の部分は256で割ったときの余りに相当します。(余りなので、0~255に収まります。)
そのため 256でModすることで、下位8ビット(0~255)が残ります。
例えば mod4 なら下位2ビットが得られます。
0~10を4で割り算して余りを調べると0~3が循環して
結果的に下位3ビットが得られることがわかると思います。
※Excelの関数にもMODがあります。
boyonboyonさん
boyonboyonさんのオーバーフローの書き込みを読んでひらめきました。
2023.06.09 13:11
今度こそ受かりたいさん
(No.8)
Howitzerさん
ありがとうございます。
そういうことでしたか。
256=2の8乗以上のビットだと割り切れるので、0下位8ビットは割り切れないのであまりになることわかりました。
おかげさまでこちらの問題の理解できました。
ありがとうございます。
そういうことでしたか。
256=2の8乗以上のビットだと割り切れるので、0下位8ビットは割り切れないのであまりになることわかりました。
おかげさまでこちらの問題の理解できました。
2023.06.09 13:47
Howitzerさん
(No.9)
お役に立ててよかったです。
訂正
誤:結果的に下位3ビットが得られることがわかると思います。
正:結果的に下位2ビットが得られることがわかると思います。
でした。
「割り算を A=Bq+r とすると、」も
「割り算A÷Bを A=Bq+r と表すと、」としたほうがよかったですね。
訂正
誤:結果的に下位3ビットが得られることがわかると思います。
正:結果的に下位2ビットが得られることがわかると思います。
でした。
「割り算を A=Bq+r とすると、」も
「割り算A÷Bを A=Bq+r と表すと、」としたほうがよかったですね。
2023.06.09 16:06
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。