質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

3236閲覧

以前に質問した「アセンブリプログラムの解説」に関しての質問です。

carnage0216

総合スコア194

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/03/18 22:58

編集2018/03/19 00:28

以下のURL先のプログラムはカラー画像をモノクロに画像に変換するためのプログラムです。

質問したいことは以下のアセンブリプログラムのダミーデータであるwMargineを求める計算部分のアセンブリプログラムに関してです。

  mov eax, width /* 幅 */ mov ebx, 3 /* 3 */ mul ebx /* 幅 x 3 */ and eax, 0x00000003 /* %4 */ mov ebx, 4 /* 4 */ sub ebx, eax mov wMargine, ebx

以前の質問の回答https://teratail.com/questions/115874
ではダミーデータを求める計算式は4-(width3)%4でも問題ないとのことですが、1ピクセルが3バイトでありwidth自体がRGB3バイトを含んでいるのだとしたらwidth3と書いてしますと、RGBを含んでいるwidthと掛けたRGBが重複してしまう気がするのですが、
個人的には本を読む限り、width=(n個の横のピクセル)(3バイト/1ピクセル)を表しているように思えます。width/4の4はRGBが3バイト故に4でバイト単位でwidthを割っており、4バイトで高速化を考えているため、widthの余りのとなった1~3バイト数のRGBはダミーデータとして扱われる。
以上のことからアセンブリプログラム内にwidthをどのように扱うか定義されていないところを見ると、
ダミーデータを求める計算式はwidth/4と書くのが正しいものであり、本に書いてある4-(width
3)%4の方はたまたま、3を掛けたらwidth/4と同じダミーデータのバイト数を得られただけだと考えています。
なので、「実は乗算も減算も不要、即ちあの部分は無駄なコードなのです」に関しては、無駄ではなく、間違ったコードなのではないかと考えています。
もしかしたら作者なりに都合よくなるようにするために書いたコードなのかもしれませんが。

皆様はどのように考えるかを解答していただけると大変ありがたいです。
どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/03/19 00:20

「width自体がRGB3バイトを含んでいる」ってどういう意味ですか?
hmmm

2018/03/19 00:26

widthという名前を付けているのだからあくまでも幅。前回の質問も見ていましたが、このコードを見て [width=(n個の横のピクセル)*(3バイト/1ピクセル)]と考えるのはあり得ない。そうであるというのであれば、該当箇所を本から引用して提示してください。また、前回の質問の回答内容をきちんと消化できていないので、まずはビットマップの仕様についてきちんと調べてください。
carnage0216

2018/03/19 00:26

わかりわかりにくくてすいません。widthは画像の幅を表しているので、RGBの情報をすでに持っているのではないかとないかと考えているのです
fuzzball

2018/03/19 01:29

画像の幅と言われたら640とか1024とか、ただの数値で、どうしてそこに「RGB情報が含まれている」と考えるのか理解できませんし、実際、RGB情報は含まれていません。
carnage0216

2018/03/19 02:45

無知でした。ありがとうございます。 「画像」の幅だったため、既にrgbの情報が入っていると思っていました。
guest

回答4

0

前の質問アセンブリプログラムの解説でベストアンサーになっているasmさんの回答が大いに参考になるのですが。

アセンブリ言語の方のプログラムはこの際置いておいて、4 - (width * 3) % 4 の式にあてはめてみてください。

例として画面上の幅(width)は15 としてみましょう。15は幅として小さ過ぎですが気にしないでください。

この場合、RGBデータは (width * 3) で15 * 3 = 45。RGBデータとして全45バイトになるのはいいですよね。次に、4 - (45 % 4) でまず、(45 % 4)の答え、45 / 4 の余り=1。この余りと言うのは4バイト境界からはみ出る分です。はみ出た1バイト分を4バイト境界に収める為にはその差を求めるわけですから、4 - 1 で3。お尻に3バイトを詰める(パディング)します。

ダミーデータを求める計算式はwidth/4と書くのが正しいものであり、

15 / 4 = 3 で商は3で、上の答えと同じになるので一見正しく思えるかもしれませんが、
では、width が200だった場合、200 / 4 = 50 となりますがこれは正しいのでしょうか。

width/4の4はRGBが3バイト故に4でバイト単位でwidthを割っており、4バイトで高速化を考えているため、widthの余りのとなった1~3バイト数のRGBはダミーデータとして扱われる。

言葉の使い方なのか、記述が足りないのか、誤解があるのか判断しかねているのですが、恐らく違います。
**「widthの余りのとなった1~3バイト数のRGBはダミーデータとして扱われる」**のではなく、width * 3で得られた数分のバイト列はビットマップデータとして全て使うはずで、お尻が4バイト境界に収まらない場合、1~3バイトの使われないダミーデータで詰めます。この手の処理はビットマップに限らず、良く行われます。

ですので、「作者が都合のいいように4-をしたり、3を掛けた」訳では無いということが言えます。

また、他の回答者様も書かれていますが、例えばWindowsのビットマップでも各種の形式があります。
carnage0216さんの読まれている書籍でどのようなビットマップを想定しているのかで取り扱いが変わってきますので注意してください。


2018/03/19 追記
解決済みの質問ですが、コメントをいただきましたので追記して補足します。

コメントより

width%4の「何」値と4-(width*3)%4のwidthの「何」の値が1,2,3…と一致しているのかわからないのです。

width = 15のケースですが、24ビットRGBデータが15画素(ピクセル)分メモリ上に展開すると、以下の図のようになります。
イメージ説明
尚、Windowsのビットマップ形式ではRGBはB,G,Rと並ぶので、図でもそのように表記しています。

図を見ていくと分かっていただけると思うのですが、画面に描画する幅、つまり画素数であるwidthの数と、それを表す為のRGBデータのバイト列でのバイト数を分けて考える必要があります。

4バイト境界と3バイトのRGB(B,G,R)データが何度もまたがります。で、この例では1から始めて45バイト目でRGBデータが終わってしまい、45は4で割り切れず、もうひとつ上の4の倍数48を満たせるよう、ダミーで3バイト詰める、と言う訳です。(図の'D'のデータ)

投稿2018/03/19 00:52

編集2018/03/19 02:52
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/03/19 00:58

dodox86さん本当にどうもありがとうございます。 ビットマップの種類を書き忘れました。 ビットマップの種類はbmpです。調べたところ1ピクセル3バイトです。
dodox86

2018/03/19 01:00

3バイト/1ピクセルであれば24ビットbmpということで、前の質問のasm様のご回答および私の上の回答もそのまま生きます。
carnage0216

2018/03/19 01:05

あの、width % 4の場合は width=15だとして、 15/4=3...3となり、(width *) % 4の場合では、このあまりの3がお尻の詰め物となるのでしょうか? また、詰めるものはもちろんrgbデータですよね。 具体的な例題のお陰でやっと理解できました。
carnage0216

2018/03/19 01:31

もう一つあるのですが、「、width * 3で得られた数分のバイト列はビットマップデータとして全て使うはずで、お尻が4バイト境界に収まらない場合、1~3バイトの使われないダミーデータで詰めます。」 に関しては勝手にやってくれるのでしょうか? あるいはアセンブリ言語で命令を書かないといけないのでしょうか? 話を見る限り、おしりを4バイトにするために各横幅に対して1~3バイトの内のどのバイト数でパディングするアルゴリズムを考えるのは難しいです。
dodox86

2018/03/19 01:31

ん?? 15を4で割っては意味無いですよね。1ピクセルを表現するのに3バイト必要です。ピクセルで表すwidth(横幅)とデータとしてのバイト数をごっちゃにしていませんでしょうか。 > 詰めるものはもちろんrgbデータですよね。 存在しない画素のRGB値は作れません。ダミーの値をつめるはずで、00hかもしれないし、FFhかもしれません。それとも前の画素の値を引っ張ってくるかもしれませんし、その辺は実装に依存するかもしれませんね。正しい幅(本来描画したい幅)は少なくともWindowsビットマップではヘッダーに書いてあるので、そこから描画すべき幅を得られます。またそれもPCの一般的なソフトだったらそれなりに厳密に処理するかもしれませんが、世に出廻っている組み込み機器等では4の倍数の幅、と決め打ちであったりする場合があります。そういった場合は使えないダミー値にならないよう、それなりの値を詰め込んだり、そもそもそういう例外は機能仕様の範囲外だったりします。
dodox86

2018/03/19 01:38

> に関しては勝手にやってくれるのでしょうか? いや、プログラマーが自分で書くのですよ。アセンブリ言語だろうがなんだろうが。 > 話を見る限り、おしりを4バイトにするために各横幅に対して1~3バイトの内> のどのバイト数でパディングするアルゴリズムを考えるのは難しいです。 この処理は回答にも書きましたが、ビットマップに限らず製品を造る上でそこかしこで出て来るような定番の処理です。それにはこれまで何度も書かれてますが、頭でばかり考えず、手を動かして実際にたくさんプログラムを作って動かすのが必須だと思います。
carnage0216

2018/03/19 01:39

ややこしくしてしまって本当に申し訳ありません。 僕はwidth%4と 4-(width*3)%4のwidthに値を入れた時の何かが一致するようなのですがあまりが一致するのか計算した結果が一致するのかわからないのです。 実際にwidth%4と 4-(width*3)%4のwidthのwidthに15を代入したとすると、width%4は3余り3になり、4-(width*3)%4のwidthは7.25となり値が全く異なります。 width%4の「何」値と4-(width*3)%4のwidthの「何」の値が1,2,3…と一致しているのかわからないのです。 width%4 width width*3 (width*3)%4 4-(width*3)%4  1   4n + 1 12n + 3    3        1  2   4n + 2 12n + 6   2        2  3   4n + 3 12n + 9    1        3
carnage0216

2018/03/19 01:43

もしかしたら僕はプログラマには向かないのかもしれません。 薄々感じてはいましたが、2年勉強してろくにアセンブリ、Ⅽ言語は理解できず、頼れる人もいないなかでとでも無謀でした。 本を買ってもいまいち理解できないし。ここでも皆様にご迷惑をかけてはかけっぱなしです。 本当に悲しくなります。
carnage0216

2018/03/19 03:09

なるほど、4-(width*3)%4の「あまり」とwidthの「あまり」値が行ったしていたわけですね! また、rgbデータを入れるメモリを確保するためにwidthに×3をしまのですね! やっと理解できて来ました。
carnage0216

2018/03/19 03:13

だとしたら、4-(width*3)%4となる理由がわかります。 4-をしたのはwidth=15の例を参考に考えると1〜3バイトのいずれを入れれば良いか知るためだったのですね。 どこの幅のお尻に埋めるパディングを埋めるかはメモリのアドレスなどを確認して、アセンブリで埋めたいお尻のメモリのアドレスを指定して、rgbデータを入れるのでしょうね。
dodox86

2018/03/19 03:15

> もしかしたら僕はプログラマには向かないのかもしれません。 本質問の主旨とは違うのと、私自身がこの手のお話に回答できるほどの力を持っていないので多くは述べませんが、私個人的な意見としては強力な好奇心と「やってみたい」と言う欲求はそれだけで大きな才能だと思っています。ですので向いていないと即断することは私にはできません。ただ、実際に手を動かせるかどうか、OUTPUTするかどうかで結局変わってくるのかな、とは思います。「英語を話せるようになりたい!」とは誰もが思うことのひとつだと思いますが、誰もが勉強してそうなっている訳ではありませんよね。(私もそうですが) 例えばOpenCVを使って具体的に何か作りたい、リンカーの作業を手で行えるようになりたい、と言うのはいわば応用で、その時点で持っている知識を総合的に組み合わせて行う作業です。もちろんいきなりそれをして悪い訳ではないのですが、プログラミングをすること自体に自信が持てないこともあるかと思います。そうであればまずはそれだけを勉強した方が、直近で成果を得られて精神的にもいいし、モチベーションも維持できますよ。
carnage0216

2018/03/19 04:59

はい!ありがとうございます。 ちなみに、私の一つ前の考えは合っていますか?
dodox86

2018/03/19 05:15

> ちなみに、私の一つ前の考えは合っていますか? えっと、合っていると思うのですが、書かれている言い回しが微妙で、確信が持てていません。(すみません) > どこの幅のお尻に埋めるパディングを埋めるかはメモリのアドレスなどを確認して、アセンブリで埋めたいお尻のメモリのアドレスを指定して だれが確認するのか?アセンブリで埋めたい、と言うのがよくわからないのですが。。。「プログラマーがアセンブリ言語でコードを書く際に、ダミーを埋め込むバイト数と位置を決めることができるように」と言う意味で書かれているのであれば、その通りです。 > rgbデータを入れるのでしょうね。 お尻のパディングはRGBデータでは無いです。あくまで4バイト境界の範囲を埋めるダミーのデータです。(使われないデータなのにRGB値を入れる理由が無いですよね) もし、今時点で完全に理解できなくても、考え続けていけば分かるようになると思いますので、突き詰めて理解しなくてもいいかもしれませんよ。個人差はあるかもしれませんが、コツとしてはずっと理由を考えて続けてみることです。ずっと考えているとある日、「あ、そういうことか。」と合点が行くことが多いです。
carnage0216

2018/03/19 05:17

あの、後戻りしてしまうようで不甲斐ないのですが、 width%4は3と4-(width*3)%4に関して、width=26と設定して、計算をしたところ、 width%4の余りは2となったのですが、4-(width*3)%4のあまりを求めることができません。 4-(width*3)%4 =4-(26*3)%4 =4-(78)%4 となりますが、 4-19.5となってしまいます。 これで埋めるパディングが-15.5とおかしな数字が出て来ます。 なんどもwidth=26の時で計算しているのですが、埋めるパディングの数値が一致しません。
carnage0216

2018/03/19 05:19

dodoxさんのお陰でどんどん知識と実践の仕方がわかります。 本当にどうもありがとうございます。
dodox86

2018/03/19 05:24

>=4-(78)%4となりますが、4-19.5と 実は前から「もしや。。。」と思っていたのですが、普通の割り算(演算子/)と剰余算(演算子%)を混同していませんか。%は割り算の余りを求める演算子です。 78 % 4 は商が19で、余りが2です。
carnage0216

2018/03/19 05:25

あ、分数のあまりから4を引いていたのですね!
carnage0216

2018/03/19 05:29

これは数値を出すためだけの都合の良い部分をアセンブリ命令で扱った工夫なのですね! 先程改めて読み直して理解できました。分数のあまりから4を引いていた事が。 やはり、アセンブリ言語は面白いです!C言語では出来ない工夫で高速化できる!
dodox86

2018/03/19 05:29

> あ、分数のあまりから4を引いていたのですね! ??? いや、4-(78)%4 を 4-(78) / 4 と認識されていて、78/4 で実数で19.5になるので、4 - 19.5 としていたのでは?
carnage0216

2018/03/19 05:31

最後にダミーデータに関してですが、4バイトにするために埋めるのですよね? rgbデータが入らないとその画素だけ、白いままで画像に違和感は出ないのでしょうか?
carnage0216

2018/03/19 05:35

はい、78/4 で実数で19.5になるので、4 - 19.5 としていたのでは?としていました。 しかし、width=26の時 4-width×3/4で、 =4-26×3/4で 26×3/4は11あまり1となり。 4ひく、あまりの1を引いて 3とでました。 この値はwidth/4のあまりと同じ数値になります。 要は「数値」が得られればよかったのではないかと思いました。 なので、アセンブリ言語は面白いと思いました。 まさか、また大きな勘違いをしていますか?
dodox86

2018/03/19 05:40

白いままになんて出ませんし、出ないようにプログラマーが責任を持ちます。 width=15 の例で、最後のダミーの3バイトをどう解釈するか/させるかは実際に描画するときにデータを渡すAPIのインターフェース仕様で決まるかもしれないし、APIの内部で適当に扱われるかもしれないし、ディスプレイドライバーで最終的に決定されるかも、ですが、ダミーをダミーとして伝える必要は基本的にプログラマーの責任です。
dodox86

2018/03/19 05:56

> この値はwidth/4のあまりと同じ数値になります。 > 要は「数値」が得られればよかったのではないかと思いました。 > なので、アセンブリ言語は面白いと思いました。 > まさか、また大きな勘違いをしていますか? 残念ですが、まだ勘違いをされている気がしてきました。。。x86アセンブリ言語かC言語かは関係ありません。 > 26×3/4は11あまり1 ??どこから出て来た答えなのか分からなくなりましたが、それはもう置いておいて、 > 要は「数値」が得られればよかったのではないかと思いました。 違いますよ。数値がたまたま同じ3になっただけですよね。答えが同じならそれでいいということではないでしょう。回答で貼らせていただいた図を見て再度考えてみてください。プログラムは、人間の思考が反映されたものです。
hmmm

2018/03/19 06:23

前の質問の回答に書いてあるんですが、4-(width*3)%4はwidth%4はの計算結果と同値だと証明可能なんです。その話を相手にきちんと説明しようとせず、また自身もきちんと消化できていないから会話が成立しない。
dodox86

2018/03/19 06:37

コメントありがとうございます。確かに前の質問でrubato6809様が言及されていました。一度読んだはずなのですが、面目無いです。4 - ((width * 3) % 4) から width % 4 の式に至る道筋があったのですね。これは私も悪かったです。混乱させてしまいました。
asm

2018/03/19 06:48

あんだけ、%は剰余を計算する演算子だって突っ込まれてたのに。。。 忘れてたのか納得できてなかったのかは不明ですが ショックですね。 ちなみにマージンを計算して付加していくよりも パディング込みのバッファ長 = (width*3 + 3) & -4 を計算して、ちょっと大きいバッファにピクセルデータを詰めていった方が個人的には楽
hmmm

2018/03/19 07:23

dodox86さん、すみません。私のコメントはcarnage0216さんへの指摘でした。 carnage0216さん、C言語の演算子もまともに理解していない状態で、C言語の演算子を使って説明されたアセンブリプログラムのコードを勉強しても時間の無駄です。C言語をまず学んだ方がいいです。
dodox86

2018/03/19 07:29

hmmm様、フォローありがとうございます。ご指摘の内容は理解していたので大丈夫です。先の質問のrubato6809様の回答内容を失念していたのは私の非ですので、それをお詫びしたつもりでした。わざわざありがとうございます。
carnage0216

2018/03/19 11:11

すいません。 もう一度皆様の回答を読み直し、明日までに理解しますので確認をお願い致します。
carnage0216

2018/03/19 11:47

お待たせいたしました。 見て頂きたいと思います。 間違ったり、勘違いしたりしてしまい申し訳ありません。 私なりにまとめたので見て頂きたいと思います。dodoxさんのおっしゃる通り、値が同じであれば良いわけではない事が理解できました。なぜならば、 (width)%4はたまたま、 4-(width*3)%4と値が同じになっただけで式をを作る過程で意味のある式ではないためです。 そして、式が4-(width*3)%4となる理由を説明したいと思います。 例えばwidth=15バイトだとします。 そして3を15バイトかけるのはrgbデータを収納するためのメモリを確保するためです。 (15*3)バイトを4バイトで割るのは(15*3)バイトの中にいくつの4バイトがいくつあるかを調べるためです。 そして(15*3)%4より、4バイトは11個ある事がわかり、1バイト余る計算となります。このおしりの1バイトを4バイトにするには式4-(width*3)%4の4からおしりの1バイトを引けば、1バイトに何バイト足せばよいかわかります。そのため、式に4-を入れました。 よって4バイト-1バイト=3バイトより、おしりの1バイトに3バイトを足せば4バイトとなり、横幅は4の倍数のバイトとなります。 以上より参考した書物に書いてある式が4-(width*3)%4である理由が証明できました。 式を作る上で結果の値さえ一致すれば(width)%4を使うのかもしれませんが、理由あっての式4-(width*3)%4が正しい式だと理解できました。 皆さま、僕の理解が正しいか確認していただけるとありがたいです。 私は出来は悪いですが、諦めず理解に努めたいです。
carnage0216

2018/03/19 11:56

dodox86さん、asmさん、hmmmさんにご確認していただけるきいです。 皆さんの良心を無駄にしたくありません。
dodox86

2018/03/19 11:58

惜しいですが足りないです。 > 以上より参考した書物に書いてある式が4-(width*3)%4である理由が証明できました。 これはOKです。 > (width)%4 これは、本質問の2018/03/19 15:23からの一連のコメントと先の質問のrubato6809様の (width%4)に関する記述を再度、読んでみてください。4-(width*3)%4の式を簡略化するとこうなると言うことが書かれています。ですので、正しいと言えます。※なお、(width%4)の答えがたまたま同じだ、とのように私が表現したのは私の間違いです。その点は混乱を呼んだと思いますので、謝ります。ごめんなさい。
carnage0216

2018/03/19 12:18

いえいえそんな謝らないでください。もとは私の理解不足が招いたことです。 私はdodox86さん、asmさん、hmmmさんのおかげで理解することができました。本当に本当にどうもありがとうございます。 (width%4)関しては再度読ませていただきます。あきらめなくてよかったです。
carnage0216

2018/03/19 12:19

dodox86さんに「OK」と言われたのはベテランの方に褒められたようで本当にうれしいです。
hmmm

2018/03/19 13:42

carnage0216さん、width%4の計算結果が4-(width*3)%4と一致する(ただし、width ≠ 4nの場合のみ)というのは、プログラムとかビットマップとかはまったく関係なく単に数学の問題です。
carnage0216

2018/03/19 22:56

? dodox86さんの「rubato6809様の (width%4)に関する記述を再度、読んでみてください。4-(width*3)%4の式を簡略化するとこうなると言うことが書かれています。」から単に数学のもんだとは言えないのではないでしょうか? あのあとなぜ簡略化できるのか、自分なりにまとめたので見ていただけないでしょうか?
defghi1977

2018/03/19 23:13

興味深く見させていただいております. 門外漢が横から恐縮なのですが 1)命題「width%4の計算結果が4-(width*3)%4と一致する(ただし、width ≠ 4nの場合のみ)」は数学的に証明されている. 2)但し, アセンブリ言語で値を求める際は「width%4」を使うよりも「4-(width*3)%4」を使ったほうが処理が単純(計算回数が少ない)となる. という認識なのですが, 如何でしょう?
carnage0216

2018/03/19 23:29

width%4=4-(width*3)%4と仮定した際に、widthについてとくとwidth=4とでます。 このwidth=4をwidth%4=4-(width*3)%4に代入すると、1=1となり一致します。ここまででは数値としての一致でしかないですが、2018/03/19 20:47での説明された4-(width*3)%4とイコールで結んだ後、同じ値が出るということは4-(width*3)%4の式の含む意味をwidth%4を持っていると考えられるため、4-(width*3)%4を簡略化した物がwidth=4だといえるのではないかと私は考えています。
carnage0216

2018/03/19 23:30

アセンブリで値さえ同じであればよいなら、「width%4」のほうが処理が単純なのではないのですか? 間違っていたらごめんなさい。
carnage0216

2018/03/19 23:36

まずは何の根拠もなくwidth%4と4-(width*3)%4をイコールで結びましたが、そのあと値と4-(width*3)%4と式が作れる理由などもwidth%4イコールできるならば、width%4は4-(width*3)%4を簡略した式と言えるのではないかと思いますが、自信がないです。
defghi1977

2018/03/19 23:39

ああ、アセンブリ言語には汎用の「剰余算」そのものが存在しないので, 「4の剰余算」という特別なケースについて計算回数をいかに少なくするかを追求すると…という文脈があるのか.
carnage0216

2018/03/19 23:45 編集

文字足らずですいません。えーと、参考にしている本にはwidth%4と4-(width*3)%4のみが書いてあり皆様との過去との話し合いで、簡略化できるwidth%4なら(CPUの構造は把握できていませんが、割り算をする回路があれば、width%4のほうが)命令が少なくて良いのではないかとのことです。
defghi1977

2018/03/19 23:46

あああすみません. 過去ログ見ていてwidth * 3の意味完璧に間違えていることに気が付きました. ここまでの二つのコメントは無視して下さい.
carnage0216

2018/03/19 23:47

もしかしたら今でも割り算は引き算を扱って、割り算と同じ結果になるように工夫されているCPUがあるかもしれないため、どちらの式をアセンブリプログラムにすれば速いかは実験しないとわかりませんが、参考書はCPUで並列処理を行い、ほとんどがアセンブリ言語で書いてあるため参考書と同じx86CPUであるならば4-(width*3)%4のアセンブリプログラムのほうが高速で処理できるのかもしれません。
carnage0216

2018/03/19 23:48

ご心配なく、わざわざ、来てくださりありがとうございます。
carnage0216

2018/03/20 00:10

あの、2018/03/20 08:29で簡略化の説明はしたのですが、dodox86さまはどう思いますでしょうか? よくよく計算したらどんな式も=と置いて、変数が導け、その変数の値を式に代入したら=が成り立つのは当然のはなしで、自分で書いておきながら間違っているような気がして気がしてきました。 robotoさんはどうやって4-(width*3)%4を「どのようなやり方」でwidth%4と簡略化できたのか過去の回答を読み返して自分なりの説明をしてみたのですが、あっているかわかりません。
defghi1977

2018/03/20 00:12

整理してみます. 1)まず, 「width幅のRGBデータを処理するにはその長さが4の倍数でなければならない」という命題があります.つまりこれは「width*3以上の最も小さい4の倍数を求めなさい」ということです. 2)そのためにはまずwidth*3を4で割った余り(width*3)%4を求め, その値を4から引いた値(所謂パディング値)を計算します (ただしパディング値が4の場合は0とします). このパディング値をwidth*3に足すと(1)の答えになります. 3)(2)におけるパディング値を求める計算式「4-(width*3)%4(但し4の場合は0)」は実は「width%4」の値と(数学的に)一致する. 4)4の剰余算「width%4」は3(0x11)との論理積「width&3」として計算できる. 5)従って「width*3以上の最も小さい4の倍数」は「width*3+width&3」である. ということでしょうか?
carnage0216

2018/03/20 00:35

ごめんなさい。私には何とも言えません。 単純に4のバイト数がいくつかわかり、かつ、おしりを1~3バイトのいずれかで(ちゃんとバイト数を考慮して)埋めるために4-をしているで良いと思うのですが。 defgi1977さんは4-(width*3)%4の簡略化について回答されているのでしょうか?
defghi1977

2018/03/20 00:42

簡略化, つまり「計算回数を減らす」目的がありそうだなと. 確かに「4-(width*3)%4」にはその計算意図がはっきりと判るため人間には優しいコードでしょう. しかし, 計算回数の観点から見ると3回の計算を必要としています. 一方の「width%4」からは一見何を目的とした式なのかが判りませんが, 計算回数は一度で済みます. 要するに「同じ計算結果が得られる式」があったとしても「わかりやすさ」を優先するか「はやさ」を優先するかでベストな方法が違うのかなと感じたわけです.
carnage0216

2018/03/20 00:51

なるほど、そうですね。私としては高速化を行いと言っている上で人間にやさしい4-(width*3)%4 を使うのは命令数が多くなるかもしれないため矛盾が起こりますが、ただただ数値だけを求めて、高速化をはかるならば人間にはわかりにくいwidth%4を使ったほうが良いのでしょうね。 私はわかりやすさとはやさを優先するのでwidth%4ほどの速さは出るかはわかりませんが4-(width*3)%4を採用します。
fuzzball

2018/03/20 01:13 編集

width%4 ≒ 4-(width*3)%4 なのは分かっているのでしょうか? (≒でも目的を果たせるのならかまわないのですが)
defghi1977

2018/03/20 01:20

右辺が4で割り切れるパターンがあるから正確には width%4 = (4-(width*3)%4)&3 でしょうか
carnage0216

2018/03/20 01:22

width%4 ≒ 4-(width*3)%4 なのは分かっているのでしょうか?に関しては、得られる値が違いますので=ではないですね。
carnage0216

2018/03/20 01:25

(width*3)%4の余りを4-しただけなので、width%4 ≒ 4-(width*3)%4であることは昨日理解できました。 なるほど、ちゃんと計算して答えの値を導くならば式はwidth%4 = (4-(width*3)%4)&3 なのですね。
carnage0216

2018/03/20 01:29

≒でも目的を果たせるのならかまわないのですが、そうですねパディングをどれだけ埋めればいいかがわかればよいので、ちゃんとして計算ではなく、2018/03/19 20:47に書いてある通り、幅を求めるのに特化した式となるため、単純に計算するとwidth%4 の式の結果と違ったりします。(昨日の午前ではそこが理解できず、困っていました。)
fuzzball

2018/03/20 01:31 編集

>>defghi1977さん そうですね。(carnage0216さん宛に書いたつもりでした) %と&は統一した方がいいと思いますけどもw >>carnage0216さん ではなぜ今日のコメントで「width%4=4-(width*3)%4と仮定した際に」などと書いているのでしょうか? あと、carnage0216さんの書き込みは引用が分かりにくいです。引用と自分の文章を区別して書いて下さい。 >>引用文 自分の文章 という感じで。
carnage0216

2018/03/20 01:35 編集

それについては「幅」を求めて「どれだけのパディングが必要なのか」を求めるプログラムとして結果の「数値」は同じだよ」という意味合いを書き忘れたためです。言葉足らずでした。 確かにアセンブリプログラムで(width*3)%4の余りを利用して4-するということを書くのとは別に、単純にwidth%4=4-(width*3)%4を計算したら=にはなりません。
carnage0216

2018/03/20 01:34

ごめんなさい。気を付けます。
fuzzball

2018/03/20 01:38

違いを分かっている上で 4-(width*3)%4 を選択したのであればかまいません。 (なぜこっちを選択したのかは私には理解できませんが)
carnage0216

2018/03/20 01:42 編集

>>引用 なぜこっちを選択したのかは私には理解できませんが 違いは分かっていますが理解しやすいアセンブリコードであり数式であるためです。 この理由ではいけないでしょうか? きっとfuzzballさんは高速化を考えて理解もできてるんだったら命令数の少ないwidth%4を使えばいいのにと考えているのではないですか?
fuzzball

2018/03/20 01:51

「引用」って書かなくていいですよw 「>>」が引用って意味なので。 >>高速化を考えて理解もできてるんだったら命令数の少ないwidth%4を使えばいい この式単体のことで言えばそうです。 もう一つ重要なのは、この式を使っている別の処理にも影響が出るということです。
carnage0216

2018/03/20 01:59

ただ今更ですが、おしりに埋めるパディングを考えるならば二つの式を考えます。 4-(width*3)%4 の余りを計算するプログラムの後、 4-((width*3)%4 のあまり数値)を計算するプログラム を書いたほうがもっとわかりやすいように思えました。命令数が長くなりますが、自分だったら以上のように書きます。 私にとっては4-(width*3)%4とまとめてしまうのが理解への妨げになっていたのかもしれません(あとはアセンブリプログラムを正しく理解できていなかった。)
fuzzball

2018/03/20 02:05 編集

私のコメント、 >>この式を使っている別の処理にも影響が出るということです については何も思うところはないですか?
dodox86

2018/03/20 02:11 編集

carnage0216さんへ。私にコメント求められていたので投稿します。 ※コメントのスレが延びているんでびっくりしました。。。 carnage0216さんの2018/03/20 07:56のコメント、 > 単に数学のもんだとは言えないのではないでしょうか? ですが、carnage0216さんが2018/03/19 10:39のコメントで引用された表、更には先の質問で、rubato6809さんが2018/03/05 01:52のコメントで順を追って説明されているように、法則性から導き出せる式なので「単に数学の問題です。」と述べられているのです。私もそう思います。この件は、以上です。(別の話題で延びているので混乱を避けるため、クローズ)
carnage0216

2018/03/20 02:20

わかりました。ここで終了させていただきます。 どうもありがとうございました。dodox86さん。 fuzzballさん、何も思うことがないわけではありませんが、式は大事ですが、数値を扱うだけというプログラムの中では式の後は数値の扱いが重要になると考えるので、処理に影響が出ないと考えています。(考えられていないかもしれませんが。)なので、今のところは「何も思うところ」はないです。
dodox86

2018/03/20 02:25

あ、クローズと言うのは「単に数学の問題です。」の件でした。別の話題を止めようと言うつもりではなかったです。申し訳ない。
fuzzball

2018/03/20 02:32 編集

>>carnage0216さん 「数値の扱いが重要になると考える」のに「処理に影響が出ない」と考えるのですか? 0であるべき数値が4になってしまうのに影響が出ないと?
carnage0216

2018/03/20 02:50

>>0であるべき数値が4になってしまうのに影響が出ないと? ごめんなさい。理解したいのですが、何が何だか。 そしてdefghi1977さん、width%4 = (4-(width*3)%4)&3に関しましては計算してみました。 個人的には4-ですでに埋めるパディングの数はわかるので、&3を付けなくてもよいように思えました。 しかし、式の形の工夫の仕方が学べました。 どうもありがとうございます。
defghi1977

2018/03/20 02:55

えーと パディングの値の範囲って0〜3じゃないのですか? widthが4の倍数の場合, (width*3)%4はいくつになりますか? その場合4-(width*3)%4の値はいくつになりますか?
carnage0216

2018/03/20 03:06

ごめんなさい 幅が4の倍数でない場合で計算したため2018/03/20 11:50のように書きました。 widthが4の倍数の場合はwidthを8として・・・・ 綺麗に割り切れた値になりました。
carnage0216

2018/03/20 03:08

(4-(width*3)%4)&3の&3から1110と0011から0010になるので整数の2ですね。 ?(width)%4ではなく、(width*3)%4ですか!?
carnage0216

2018/03/20 03:09

(width*3)%4ならば、width=8と置いた場合の式は (width*3)%4=4-(width*3)%4ではないです。 (width)%4ならば、 (width*3)%4=4-(width*3)%4となります。
defghi1977

2018/03/20 03:33

>widthが4の倍数の場合, (width*3)%4はいくつになりますか? width*3は4で割り切れるため答えは「0」です. >その場合4-(width*3)%4の値はいくつになりますか? 4−0は4です. 従って, widthが4の倍数の場合, 「4-(width*3)%4」の値は正しいパディングの範囲0〜3に収まりません. そこで (4-(width*3)%4)%4とすることで正しいパディング値としているのだと.
carnage0216

2018/03/20 04:08

どうも、すいませんでした。 大変勉強になりました。 あまりはたしかに0ですね。 てっきりあまりでない商の話をしているかと思いまたもや勘違いしていました。どうかお許しください。 ただ、(4-(width*3)%4)%4と以前の式4-(width*3)%4に%4をする事でパディング値が収まる理由が実際の値、1263とかを代入してやっているのですが、やり方がわかりません。 もとの4-(width*3)%4でならちゃんと0〜3の範囲でパディング値がでますが、ダメなのでしょうか?
carnage0216

2018/03/20 04:13

是非理解したいので、具体的な数字を代入しての説明をして頂けないでしょうか? どうかよろしくお願い致します。
carnage0216

2018/03/20 04:15

4で二回 割る必要はあるのですか? 4で一回割ったあまりに必要なパディングは4-で出してはいけないのですか?
fuzzball

2018/03/20 04:16

何回同じことを繰り返すんだろう‥。
defghi1977

2018/03/20 04:29

>具体的な数字を代入しての説明をして頂けないでしょうか? であれば, width値が1から100までの全てについてパディング値を計算してみましょう. おそらく途中で何らかの法則に気がつくはずです. (これは数学的直感を養うトレーニングですのでぜひお試しください)
carnage0216

2018/03/20 05:26 編集

まさか!? 4-(width*3)を4で割る事で割り切れるのですね。 どうやって、これを閃いたのですか?
carnage0216

2018/03/20 05:34

ですが、例えば、width=99のとき、99×3で297バイトとなり 3バイトがあまります。 この3バイトは、捨てるのですよね? そして、4を引いた商の72バイト この72バイトは4の倍数であるため、そのまま使えば、72バイトは4の倍数なので無駄なく幅を埋められるわけですか?
carnage0216

2018/03/20 05:39

たしかに、法則性はわかりました。4で二回割れば割り切れます。しかし、それによって幅が4の倍数となり、パディングが必要なくなると思っているのが私の理解です。 もし間違っているならば、 申し訳無いのですが、 どのような意図で式を作ったのか説明して頂けないでしょうか?
fuzzball

2018/03/20 05:50

プログラミング言語の勉強する前に、日本語の勉強した方がいいよ。 日本語が大丈夫だと思っているのなら病院に行った方がいい。 これ、冗談でも嫌味でもなく真面目に言ってます。
episteme

2018/03/20 05:50

回答依頼が来てたのでいまさらなんだが... width=99すなわち画像の横幅が99pix.であるとしよう。 1pix.に3byte(つまり24bit-color)であるなら、一行297byteとなる。 画像フォーマットが「一行のbyte数は4の倍数となるべし」であるなら、 余分なマージン:3byteを加えて300byteとする(これで4の倍数となる)。 画像の横幅がwidthであるとき、マージンを計算するのが与えられたコードなのだが、なにがわからんのかな?
carnage0216

2018/03/20 06:32

また、4で二かあ割るならば、4-はいらないですよね? 1回めの4の割り算で得たあまりもどうするのかわかりません。 なぜそのような式を作ったのかもう一度、どうか説明して頂けないでしょうか? どうかよろしくお願い致します。
carnage0216

2018/03/20 06:35

単位が理解できていませんでした。 fuzzさん、たしかに僕は頭が悪いです。皆様にもご迷惑かけていますが、頭にきます
defghi1977

2018/03/20 06:36

> なぜそのような式を作ったのかもう一度、どうか説明して頂けないでしょうか? ここまでの回答及びコメント(あなたのものを除く)のログに全て記載されていますから, 納得できるまで読み返してみましょう
carnage0216

2018/03/20 08:54

わかりました。 ごめんなさい。
carnage0216

2018/03/20 08:58

fuzzさん、 「病院に行った方がいい。」 はまじめにおっしゃるのであっても許せないです。 謝って頂きたいですが、私にも非があります。 しかし、暴言として通報します。
fuzzball

2018/03/20 09:04 編集

「インフルエンザじゃないの?病院行ってみたら?」というのは暴言なのでしょうか。 病気かもしれないと心配しているのですよ。
carnage0216

2018/03/20 09:18

fuzzさんは良心で言っているのか私が馬鹿だから言っているのか、知りませんが、 日本語を勉強したらの後に病院にいったらは暴言かはわかりませんが、大変傷つきます。
dodox86

2018/03/20 10:31

私の回答から始め、コメント欄からこのようなことになってしまい責任を感じずにも居られないのですが、mkgreiさんの回答とコメント欄で救いを得た気もします。 carnage0216さん。 先にも書きましたがその好奇心と向上心はひとつの才能だと思っています。これまで他の回答者様らが書かれてきたことを反芻して、勉強の進め方を考えてみてください。きっと見えるものが変わってきます。学習環境も大きく影響するので、独学に限界を感じるならば何かしらのプログラミングスクールや団体のようなものに入って、先生やメンターの方に教えを乞うのも有効だと思います。(相性や先生自体のレベルの問題もあると思うので過信は禁物ですが) 直近、この数週間の一連のQ&Aでヘコむこともあったかと思いますが、長い目で考えてください。私を例にあげれば、時間だけはウン十年間はプログラミングに関わっていた訳です。そう簡単に追いつかれたのではこちらとしてもたまったもんじゃありませんw それでも(恥ずかしながら)一部の天才や、若い頃からちゃんと勉強をされてきた方には到底敵わないと感じることもしばしばです。特に、最近ではPCの性能向上に伴って機械学習や画像処理のプログラミングが身近になって、数学などの素養がますます必要になってくると考えています。基本は本当、大事です。後で変わってきます。まだお若いのでしょうから、まだまだこれからやれることは多いですよ。疲れたらとっとと休んで、回復したらまたがんばってください。
carnage0216

2018/03/20 10:53

涙が出てきます。 なんか、本当にどうもありがとうございます。 僕は皆様の過去の回答を復習しながら手を動かしています。やっとです。僕はできが悪いですが、理解しないといられないたちです。 本当にどうもありがとうございます。 プログラミングスクールもバイトで貯めたお金でなんとか通えそうです。
carnage0216

2018/03/20 10:59

defighさん。間違いたくて間違っているわけではなく、何度も読み直しては失敗していますが、確認をお願いできないでしょうか。文章がまだ書き慣れていないゆえに本当に理解できているかなど疑われて仕方ないですが、理解できていると思うんです。少しづつですが。 あの、結論から言うとwidthが4の倍数であれ、奇数であれ (4-(width*3)%4)%4なら0 〜4のパディングを考慮して4-で対応できますが、 4-(width*3)%4ではパディングは1〜3しか考慮できないので4-で得たものが1〜3のいずれかを(場合に合わせて)足さしてパディングとなる。 どっちを使っても大丈夫だが、アセンブリプログラムのサイズが変わるのかと思います。また、明日までに (4-(width*3)%4)%4のアセンブリプログラムを書いてきますので、確認をお願いできないでしょうか? 間違いか正しいかも大切ですが、アセンブリプログラムにして実行してみます。
defghi1977

2018/03/20 11:17

いや, この部分純粋に算数の範疇の問題なので, アセンブリ言語の門外漢の私でも理解できたわけで. もっとシンプルに考えましょうよ. まず, (4-(width*3)%4)%4をwidthが1から10まで計算してみますね. width= 1の場合(4-(width*3)%4)%4=1 width= 2の場合(4-(width*3)%4)%4=2 width= 3の場合(4-(width*3)%4)%4=3 width= 4の場合(4-(width*3)%4)%4=0 width= 5の場合(4-(width*3)%4)%4=1 width= 6の場合(4-(width*3)%4)%4=2 width= 7の場合(4-(width*3)%4)%4=3 width= 8の場合(4-(width*3)%4)%4=0 width= 9の場合(4-(width*3)%4)%4=1 width=10の場合(4-(width*3)%4)%4=2 (NOTE:ここで値が1から0の範囲でループしていることに気が付いてほしいのです) 一方width%4の値については width= 1の場合width%4=1 width= 2の場合width%4=2 width= 3の場合width%4=3 width= 4の場合width%4=0 width= 5の場合width%4=1 width= 6の場合width%4=2 width= 7の場合width%4=3 width= 8の場合width%4=0 width= 9の場合width%4=1 width=10の場合width%4=2 そのため, なんとなく「width%4=(4-(width*3)%4)%4」が成り立っていそうだと思えますね. そしてこの関係式は数学的に証明することが可能です.(この部分はここまでのコメントで幾度も議論されているとおりです.) そして最初に見た「width*3以上の最も小さい4の倍数を求めなさい」に戻るとこの答えは width*3+width%4 となり, 実際にこの値を計算してみると width= 1の場合width*3+width%4=4 width= 2の場合width*3+width%4=8 width= 3の場合width*3+width%4=12 width= 4の場合width*3+width%4=12 width= 5の場合width*3+width%4=15 width= 6の場合width*3+width%4=20 width= 7の場合width*3+width%4=24 width= 8の場合width*3+width%4=24 width= 9の場合width*3+width%4=28 width=10の場合width*3+width%4=32 と, なるわけです. ちゃんと4の倍数になっていますね. (NOTE:なぜ4の倍数としなければならないかは, そのほうが処理しやすいからという回答がありましたね) この続きとしてdodox86さんの回答があります. --- carnage0216さんにはアセンブリ言語(プログラミング)云々の前に是非この「数の法則性」を見出す(これを数的直感力といいます)トレーニングを積んでほしいのです.
carnage0216

2018/03/20 13:59

回答ありがとうございます。 あの数の法則性を見つけるとは、IQテストなどでしょうか?
carnage0216

2018/03/20 14:07

width*3+width%4 この式があればわざわざ0~3のバイト数を考慮して4の倍数のパディングを作るなどの式はいらないですね。
hmmm

2018/03/20 14:34

defghi1977さん、https://teratail.com/questions/115874 の質問を見るとわかりますが、もともとのプログラムではwidthが4の倍数であるときはjzでジャンプしています。今回の質問は前回の質問の一部を切り取ったものです。なのでもともと4の倍数については考慮する必要がありません。
asm

2018/03/20 14:59

> width*3+width%4 上でも書いたけど (width*3 +3) & -4 がオススメ 1. 変数が式中に1個だけなのでレジスタ1個でいい 2. width*3だけ取り替えれば16bitカラーや8bitカラーに対応できる
carnage0216

2018/03/20 15:46

いくつもの式の作り方があるのですね。あの一つ質問、大丈夫でしょうか? 論理積 -4を付けるのはわかります。前の回答でも答えた通りwidthに3を掛けているのはRGB(3バイト)を入れるメモリを確保するためです。そして+3はwidth=1の時に得られる二進数が0(4の倍数の数値ではない)を得ないために+3を入れたのですよね? width=2以降はで計算した後、 & -4より 得られる答えが100、1000、110など4の倍数の数値が得られます。 以上からおっしゃる通り(width*3 +3) & -4が一番シンプルで工夫された式に思えます。 あの以上の私の考えはあっていますか?間違えて怒られるのいやですが、心配なので確認をお願いいたします。
carnage0216

2018/03/20 15:51

えーと。width*3をwidth*2にすれば16bitカラーに、width*1にすれば8bitカラーに対応できるということですか?
asm

2018/03/20 16:04

あっていると思いますよ まず、-4が2の補数表現により0xFF....FCを表します 2進数で表すと0b11....100です 省略した部分は何bitの整数かで変化します。 width*3+3はパディング抜きにして必要なデータサイズに+3することで4で割り切れない場合は桁上げ、みたいな事をしています。 そして、-4(0b11....100)との論理積を取ることで端数を取り除いています。 > width*3をwidth*2にすれば16bitカラーに、width*1にすれば8bitカラーに対応できる そのとおりです。 4bitとか1bitのbitmapだと必要量を計算するのがちょっと面倒ですが それでも同様に+3して&-4でパディング込みの1行ごとのデータサイズが得られます。
carnage0216

2018/03/20 16:07

やっと、プログラムを組む思考回路がほんのちょっとできてきて本当にうれしいです。 やっと入門の手前に来れた感じです。
carnage0216

2018/03/20 16:07

asmさん 詳しい解説と確認、どうもありがとうございます。
hmmm

2018/03/20 17:16

carnage0216さん > それでも同様に+3して&-4でパディング込みの1行ごとのデータサイズが得られます。 この1行ごとのデータサイズのことをストライドと呼びます。 そもそもなんでパディングを求めていたかというと、このストライドを求めるためです。 ストライドをどう求めるかはよくある質問です。 1bitから32bitまでのBITMAPに対応する計算方法ももうすでに誰かが考えています。 ですので、興味があればbitmap strideなどで検索してみてください。
defghi1977

2018/03/20 19:01

> もともとのプログラムではwidthが4の倍数であるときはjzでジャンプしています。 これは失礼しました. そこまでは読み込んでいませんでした. ともあれ普段高級言語しか使っていないとこういったネイティブに近い考え方も新鮮でいいですね.
guest

0

※質問への直接な回答ではありません。


dodox86さんの回答のコメント欄を拝見しました。

carnage0216さん

カオスですね…
サクッと回答が得られていない、というより、
回答をすんなり理解できるほどの基礎がないので、
コメントが発散しています。
そして発散することによって混乱が生じています。

途中から読むのではなく、話をまとめてみてください。
そしてまとめた後にわからない行間を意識してみてください。
どこかに得られた結論をまとめてみないと理解した気になっているだけのように思います。
「つまり〜」、「〜なのですね」などが結構正しくないです。


もっと基礎的なことから勉強しても恥ずかしいことではありません。
https://www.amazon.co.jp/コンピューター-テクノロジー解体新書-ロン・ホワイト/dp/4797384298


はっきり申し上げて、低レイヤーは難しいです。
Pythonのエキスパートでも、C++は相当難しく、C++が達者でもアセンブリは難しいです。
人間がやりたいこととその言語ですぐにできることがかけ離れているからです。
アセンブリ言語で追求するのは前の質問でrubato6809さんがお答えしたような命令文をいかに少なくして少しでも高速化することです。
つまりやりたいことがわかった上で、それをいかに効率よく行うかが議論の対象になります。
ですので、そもそもやりたいことを理解するのに苦労していると話が合わないのです。

Cのコンパイラだってアセンブリ言語で書かれているわけではありません。
https://note.mu/ruiu/n/n44e161a0c243
https://qiita.com/ruiu/items/4d471216b71ab48d8b74
歴史的には低級言語で書かれた部分もありますが、
そこから作ったコンパイラを使ってCでコードを書いてコンパイラを作っていくのです。

どうしてもというのであってもOpenCVなどはいけません。
中身が(多すぎて一人の人間がアセンブリ言語で眺めて理解するには)難しすぎます。


どうしてもというのであれば、ここまで回帰してください。
https://qiita.com/advent-calendar/2017/lowlayer
基礎的でありながら、おもしろいです。

投稿2018/03/20 07:26

編集2018/03/20 07:28
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/03/20 08:53

じっくり読ませて頂きます。このサイトを退会するかもしれませんが、すべて私の責任です。ご迷惑をおかけしました。 頭を冷やします。
defghi1977

2018/03/20 09:06

退会する必要は無いよ. ただ, プログラムを組む上での論理的思考の部分のトレーニングが欠けているだけで, そのためには初等数学レベルからやり直したほうがよい. あなたは周りからとやかく言われようとも向上心があるだけ見込みはある. また, そのために判らないことを質問する勇気がある. だから皆さんがコメントを大量に残してくれているんだ. 一番たちが悪いのが, 判らないことを質問しただけで全く回答を読まずに, やれ動かないだのこうじゃないだの, 挙句の果になんで動かない回答を提示するんだと逆ギレする人. こうなるともう質問を見ただけで低評価を付けるしか無いんだ.
mkgrei

2018/03/20 09:22

defghi1977さんの仰るように、理解しようと努力していると思われているから回答やコメントをする方々がいるわけです。 基礎は大事です。 小学校からはじめて段階的に中学校、高校、大学までやってきてついには大学院レベルの話がわかるようになります。 それを飛ばして、いきなり大学院レベルのことをやろうとしても、ごく限られた一部の天才を除いて、何年かけても理解することはできません。 これは凡人にとってはセンスの問題ではありません。 なぜなら、大学院レベルのことを理解するために必要な「閃き」がたくさん積み重なっているからです。 それを先人に学ぶことなく、自分で閃こうとしているわけです。 一生では足りません。 もう少し簡単なものからはじめて、「理解した」ということを積み上げていただければと思います。 目標を持つことは大事です。 ただ、目標を達成するために、段階的にできることからやることもまた大事なのです。
defghi1977

2018/03/20 10:00

> carnage0216さん それに, 回答者側としても相手のスキルレベルに合わせて「どのように答えたら良いのか」についていろいろ考えを巡らせており, その行為が結果として自身の理解を深めたり, 説明スキルを磨く結果をもたらしているのです. つまりwin-winの関係ですね.(この点ががteratailの存在する意義の一つです) ただ, その行為は非常に頭を使う行為でもあり, 質問者から的はずれな内容や判らないという返答が返されると, しばしば心無い罵倒や口論を引き起こすことがあります. 特に「自分の頭が悪いからわからないんだ」という自虐的な態度はかなり回答者の精神に堪えます. この部分は忘れないで下さい.
carnage0216

2018/03/20 16:00

そこまで頭が回っていませんでした。ほんと何やってるんだかって感じです。 はい、前にAVRを進めていると言っていたのを覚えていらっしゃいますか。 今回の件をもってAVRのほうに力を注いでいきたいと思います。基礎勉強のために。 この考えはどうでしょうか? もしかしたらAVRマイコンを学ぶ上でアセンブリやバイナリの、今回のような質問やAVRとは別で好奇心で質問してしまうかもしれませんが。 わかりました。自虐的なことは出来る限り辞めていきます。なのでこれからもご指導、ご指摘どうかよろしくお願いいたします。
carnage0216

2018/03/20 16:03

どうもありがとうございます。 >>一番たちが悪いのが, 判らないことを質問しただけで全く回答を読まずに, やれ動かないだのこうじゃないだの, 挙句の果になんで動かない回答を提示するんだと逆ギレする人. こうなるともう質問を見ただけで低評価を付けるしか無いんだ. まるで私ですね。でもやっと少しずコードの組み方などほんの少しわかることができました。実装などもできてきました。
carnage0216

2018/03/20 16:05

defghi1977さん。 mkgreiさん。 どうもありがとうございます。 逃げずに頑張ります。
defghi1977

2018/03/20 20:02 編集

> 前にAVRを進めていると言っていたのを覚えていらっしゃいますか。 いいえ, 私はちょっとした興味(なんかいつもコメントが上がっているなあと思った)から質問を覗いてみただけの, ただのJavaScript使いです. 以前JavaScriptでBitmap触った時と似たようなことやったな―とつい口を挟んでしまっただけです. > まるで私ですね。 あなたは違いますよ. あなたの質問にはさほどマイナスは付いていません. そこは誇っていい. 向上心に欠ける人の質問には-1などではなくもっとたくさんの低評価が付いています. こういう人たちはあなたと違って回答やコメントをはじめから全く読んでいないし聞きもしない. すると回答する側のストレスのみが蓄積していき, 答える気力すら失せるという本当の意味での悪循環を引き起こすため, 低評価を付けることで皆の目から遠ざけているのです.
carnage0216

2018/03/21 12:50

そうなのですね。 私の場合は読むにしても理解に時間がかかり、回答者様にご迷惑をおかけしたりで、もっと理解力と読解力を付けないといけないです。基礎能力もです。
guest

0

ベストアンサー

元質問も長文なのであまり読んでませんが、そもそもそのコードはどこからもってきたもんなんでしょうか。
それがどういう意図があるのかというのはそれこそ作者に聞いてこないと、他人がいくら議論したところで机上の空論にしかならないと思いますが。

投稿2018/03/18 23:31

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/03/18 23:43

ごめんなさい。本に付属したCD-ROMから持ってきたプログラムです 前回の質問と解答を隅々まで読んでいただければこの質問は空論ではないかもしれないと思っていただけるかもしれませんが、読んでいただけないのならば空論なのかもしれませんね。 作者に聞けないからこそ、ここで解決の糸口をさがして、答えを白黒はっきりさせたいのです。
y_waiwai

2018/03/18 23:55

なら実際に動かしてみたらどうでしょうか。 その元のコードと、あなたが考えた最良のコードと。 目的とするモノクロ変換の動作はもちろん、実行時間や変換効率なども含めて何らかのデータは得られるものと思われます。 いくら自分が考える理想のコードを振り回してもなにもなりませんぜ。
carnage0216

2018/03/19 00:04

実際に動かして同じ結果が出ました。 結論として、作者が都合のいいように4-をしたり、3を掛けたと考えます。 出来れば、他の方の意見も聞きたいと思いましたが、なんだか嫌な気分なのでやめます。
carnage0216

2018/03/19 00:05

初心者のために少し遠まわしなプログラムを書いたのかもしれません。 もうわからないです。
y_waiwai

2018/03/19 00:10

初心者向け、ということでそうなのかもしれません。 作者の意図は私達にはわかりませんが。 #できれば質問に、これまでの議論の経緯と、実際に動かしたならその結果ぐらいを提示して #いただきたかったなあ、とはおもいました。
umyu

2018/03/19 00:42

> carnage0216さんへ 1,書籍なら書籍の出版社のサポートに聞いてみてはどうでしょうか。 2,ものすごく悩んでるのは分かりますが、質問文が分かりづらすぎます。 質問するときのヒントのhttps://teratail.com/help/question-tips を一度読んでみてくださいな。
carnage0216

2018/03/19 00:43

はい。質問を終了してサポートを聞いてみます。
y_waiwai

2018/03/19 00:59

ああ、いまID見て気がついた。。
carnage0216

2018/03/19 01:44

あの、また何か僕はしたのでしょうか?
carnage0216

2018/03/19 01:46

y_waiwaiさんにはお世話になっていることがありますが、心が傷つくようなことばかり言われているよでとても落ち込みます。 できれば、私もできるだけわけのわからない質問は控えますので、ほっといていただけないでしょうか。
y_waiwai

2018/03/19 01:50

いや、最初にそのIDに気がついてれば、対応の仕方も変わったのになーというだけのはなしです。 お気になさらぬよう
carnage0216

2018/03/19 02:11

どういうことですか!? 英語の意味って事ですか?
carnage0216

2018/03/19 02:13

対応云々で相手を不快にさせるのはやめてください。 最悪だと、思います。 通報しますよ。意味があるかはわかりませんが。(-.-;)
y_waiwai

2018/03/19 02:14

いや、最初にあなたとわかっていれば、もうちょっと有意義な回答ができたのになーということです #ち、真面目に相手して損したぜ。
carnage0216

2018/03/19 02:16

ごめんなさい。 僕は本物の馬鹿です。 言葉を表面的にしか受け取ることができないだけです。 通報なんてしません。 僕が臆病なだけです。
carnage0216

2018/03/19 02:17

僕を通報しない人がいないこと自体が不思議です。 まぁ、僕は相手にされていないのでしょう。
umyu

2018/03/19 02:24 編集

>carnage0216さんへ ごめんなさい。一言だけいいます。 自分を馬鹿だと卑下するのは別にいいのですが、 じゃあ私がコメントで回答した「質問するときのヒントのhttps://teratail.com/help/question-tips を一度読んでみてくださいな。」 これを読んでみましたか? 読んだら、質問文を書き直すか、コメントで一言発言しませんか? 貴方は返事は威勢がいいのですが、実際に行動しているように、画面越しには見えないのです。 貴方の質問文も以前から、色んな人にわかりずらい、あやふやな表現だと指摘されてますよね。 そういうのを質問する前に一度落ち着いて、質問文を見直してくださいな。 悩んでるのは理解できますが、いろいろ焦っているように見受けられます。 まず、落ち着いてくださいな。私から伝えられることは以上です。
carnage0216

2018/03/19 02:47

はい。わかりました。 おっしゃる通り、焦っています。avrマイコンをpcのプログラムとは別で勉強しています。 今のところは順調です。
carnage0216

2018/03/19 02:50

じっくり読ませて頂きます。 あの、今後もよろしくお願い致します。 そして、直すべきところは必ず直すので、今まで通り指摘してください。 どうかよろしくお願い致します。
y_waiwai

2018/03/19 02:58

指摘するのはまかせてくれたまえ。 んで、それに対し不快になるから、とか、私は馬鹿だから、とか甘ったれたことは言わないように。 そういうのは、逃げにしかならん。 質問されて、それに回答する、それで結局理解できないってことでもそれは別に構わん。 しかし、そこでプログラマには向いてない、とか無謀だった、とかで逃げられると、ナンノコッチャってことになるのを理解してくれ
carnage0216

2018/03/19 03:03

わかりました。 まだ、未熟のニュービーですが、どうもよろしくお願い致します。 y_waiwai様、生意気な事を言ってしまい申し訳ありませんでした。
y_waiwai

2018/03/20 09:31

だから逃げるんじゃねえ。 ひとに迷惑かけてるってのはわかりきってることなんだから、これもコミで開き直らんとアカンだろ その理解の悪さはオレも病的だと思うが、そうならなおさら食い下がっていかんと人並みにもなれんってことなんだから まー、ID変えるってならそんでもいいとは思うがw #返答不要
guest

0

コメントは伸びすぎなのでこちらに書きます。

4-(width*3)%4がwidth%4と等しい(ただしwidth≠4n)

これを証明するには高校数学程度の知識と剰余算の分配法則の知識が必要です。

もうこの問題は数学の話なのでwidthはxと置き換えます。
つまり
4-(x*3)%4=x%4 (ただしx≠4n)
を証明する。

1.x=4n+1 の場合
左辺
4-(x*3)%4
=4-((4n+1)*3)%4
=4-(12n+3)%4
=4-(12n%4+3%4)%4 //剰余の分配法則
=4-(0+3)%4
=4-3%4
=4-3
=1

右辺
x%4
=(4n+1)%4
=(4n%4+1%4)%4
=(0+1)%4
=1%4
=1

よって左辺=右辺が成り立つ。

あとは
x=4n+2
x=4n+3
についても同じように計算すれば証明終了

投稿2018/03/20 11:57

hmmm

総合スコア818

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/03/20 13:53

どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問