アプリ版:「スタンプのみでお礼する」機能のリリースについて

mov eax, width
mov ebx, 3
mul ebx
and eax, 0x00000003
mov ebx, 4
sub ebx, eax
mov wMargine, ebx
以上のプログラムは画像の横幅、
width(幅)を4の倍数にするために
4-(width*3)%4であまりを求めて、4-(width*3)%4のあまりのバイト数を、あまりに足して4バイトにしてwidthを4の倍数にするというプログラムなのですが、
本には(4-(width*3)%4)%4でも良いと書いているのですが、なぜ4で二回も割るのかわかりません。

最初の式4-(width*3)%4は
(width*3)%4であまりを求めて、
4-あまり=より、何バイト埋めれば、あまりと4-あまりによってwidthを4の倍数に出来ることがわかります。

もう一つの式(4-(width*3)%4)%4
に関しては途中までは上と同じなのですが、(width*3)%4)で得られた商をさらに4で割り、4-あまり=にしたいのかなと考えています。
ただ、例えば、widthが99バイトだとします。
3×99より297となり、297割る4で76あまり3となります。
本には解説が少なく、このあまりの3バイトが最初の式のようになるのか、どのように扱われるかわかりません。
その後、76割る4から余りが出ない商が得られます。すなわち、widthが4の倍数になった?のだと思います。

疑問は二つあります。
一つは途中で得られたあまり3がどこに扱われたというかどこにいってしまったのかという事と。
二つめは4で二回割ればあまりの出ないので、式に4-が書いてある理由がわかりません。
個人としては((width*3)%4)%4で良いのではないかと思っています。
どうか、二つの疑問について、教えていただけないでしょうか?

昨日からずっと考えているのですがさっぱりです。どうか知恵をお貸しください。

質問者からの補足コメント

  • つらい・・・

    唯一解説に、widthが4の倍数の場合, 「4-(width*3)%4」の値は正しいパディングの範囲0〜3に収まりません. (←計算したら収まるのですが、なぜ収まらないのですか?)
    そこで (4-(width*3)%4)%4とすることで正しいパディング値としているのだと.と書いてありますが
    widthが4の倍数でない場合でも4-(width*3)%4でも(4-(width*3)%4)%4でもパディングの範囲は0〜3に収まると思うのですが、何が違うのかさっぱりです。

      補足日時:2018/03/20 19:17
  • あの、少し疑問に感じたのですが。
    64bitも32bitpcも32bit処理なので、4倍、すなわち4バイトで扱ったのだと思います。ただ、
    4倍のバイト数の方が処理より、4バイト(32bit処理)づつ送るやり方の方が処理が速いように思えるのですが、なぜ4バイトづつではなく、4「倍」のバイト数で処理したのでしょうか?

      補足日時:2018/03/20 21:48

A 回答 (4件)

前提が不明ですが推測すると


任意のwidthに対して、width*3に補正値を加えて4の倍数にしたいのだと思います。

関数を以下の様に定義します。
pad1(width) = 4-(width*3)%4
pad2(width) = (4-(width*3)%4)%4

widthが4の倍数以外の場合
例えばwidth=9とすると

width*3+pad1(width) = 27+1 = 28
width*3+pad2(width) = 27+1 = 28

となり、どちらの式も4の倍数が得られます。

次にwidthが4の倍数の場合
例えばwidth=12とすると

width*3+pad1(width) = 36+4 = 40
width*3+pad2(width) = 36+0 = 36

となり結果が異なります。
感覚的にはpad2(width)を使用した方が正確だと思えるのですが、pad1(width)でも問題ないかは使用する目的によるのでしょうね。



> 個人としては((width*3)%4)%4で良いのではないかと思っています。

この場合、widthが4の倍数でないとき
width*3+padが4の倍数になりません
    • good
    • 0

まず画像のフォーマットがわからんことにはなんともいえない. そして「4倍のバイト数の方が処理より、4バイト(32bit処理)づつ送

るやり方の方が処理が速いように思える」とはどういうことでしょうか? 具体的に説明してもらえますか?
    • good
    • 0

No2です。

回答途中で送信してしまいました。

>4-(width*3)%4でも(4-(width*3)%4)%4でもパディングの範囲は0〜3に収まると思うのですが、
前者は0〜3ではなく 1〜4 の範囲になるのでは?
    • good
    • 0

>(width*3)%4)で得られた商をさらに4で割り、


%は「商」ではなくて「剰余 (余り) 」ですよ

http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture …
    • good
    • 0

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