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で良いのではないかと思っています。
どうか、二つの疑問について、教えていただけないでしょうか?
昨日からずっと考えているのですがさっぱりです。どうか知恵をお貸しください。
No.1ベストアンサー
- 回答日時:
前提が不明ですが推測すると
任意の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の倍数になりません
No.4
- 回答日時:
まず画像のフォーマットがわからんことにはなんともいえない. そして「4倍のバイト数の方が処理より、4バイト(32bit処理)づつ送
るやり方の方が処理が速いように思える」とはどういうことでしょうか? 具体的に説明してもらえますか?No.3
- 回答日時:
No2です。
回答途中で送信してしまいました。>4-(width*3)%4でも(4-(width*3)%4)%4でもパディングの範囲は0〜3に収まると思うのですが、
前者は0〜3ではなく 1〜4 の範囲になるのでは?
No.2
- 回答日時:
>(width*3)%4)で得られた商をさらに4で割り、
%は「商」ではなくて「剰余 (余り) 」ですよ
http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- その他(プログラミング・Web制作) Pythonによる物理の斜方投射の位置座標表示について 2 2023/06/05 12:46
- JavaScript jQueryでのレスポンシブが綺麗に動かない 3 2022/06/21 11:08
- JavaScript 【jquery】EasyUIのSubGridにMySQLのテーブルデータを表示&編集にしたい 5 2022/05/02 13:10
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
- PowerPoint(パワーポイント) ExcelのVBAコードについて教えてください。 3 2022/05/25 14:32
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
- その他(プログラミング・Web制作) 物理の斜方投射で目盛りに数値を入れたい 2 2023/05/27 06:32
- 英語 The primary outcome variable was the overall coron 3 2022/09/28 16:11
- HTML・CSS スクロールすると追従する画像のコードを書いているのですが、追従する画像の大きさの調節が上手くいきませ 2 2022/04/18 12:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
エクセルシート名の制限を変更...
-
10Mバイトて文字数に すると何...
-
バイト列とバイナリ列の違いが...
-
Javaで日本語1文字のバイト数
-
2バイト文字の判定はString#get...
-
char str[256]の256の意味は?
-
【VB2005】テキストボックス内...
-
COBOL PICTUREで X,S,Vの意味
-
UCS-2の一覧表が欲しい
-
Excel VBA で Oracle CLOB型カ...
-
VBAでShift-JISのURLエンコード
-
64bit対応
-
SQLで1バイト、2バイト混在...
-
ピクセル,dpiから容量(バイト...
-
3バイト文字(UTF-8)をprintfで...
-
ソケット通信の受信サイズ
-
テキストBOXの入力制限について
-
日付時刻を4バイトに
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
エクセルシート名の制限を変更...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
バイナリとBCDコード
-
「1TB」のHDDに日本語は何字入...
-
Javaで日本語1文字のバイト数
-
バイト列とバイナリ列の違いが...
-
SQLで1バイト、2バイト混在...
-
ピクセル,dpiから容量(バイト...
-
C++ Builderで文字列をバイトに...
-
64bit対応
-
ワイド文字のバイト数が取得で...
-
UCS-2の一覧表が欲しい
-
3バイト文字(UTF-8)をprintfで...
-
VBAでShift-JISのURLエンコード
-
機種依存文字をチェックしたい。
-
ビットスワップとバイトスワッ...
-
VBSでテキストファイルの文字列...
おすすめ情報
唯一解説に、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に収まると思うのですが、何が違うのかさっぱりです。
あの、少し疑問に感じたのですが。
64bitも32bitpcも32bit処理なので、4倍、すなわち4バイトで扱ったのだと思います。ただ、
4倍のバイト数の方が処理より、4バイト(32bit処理)づつ送るやり方の方が処理が速いように思えるのですが、なぜ4バイトづつではなく、4「倍」のバイト数で処理したのでしょうか?