コードは、画像の形をしたボタンの作成に役立つQtライブラリから取得されます。すべての行yとすべての幅xをスキャンし、ピクセルのrgb部分がマスキング部分と一致すると次の変更を生成します(mpは行の先頭のポインターであり、0xffで事前に入力されています)。
*(mp +(x >> 3))&=〜(1 <<(x&7));
私はそれを本当に解釈することはできません。手を差し伸べるバックグラウンドを持っている人はいますか?
コードは、画像の形をしたボタンの作成に役立つQtライブラリから取得されます。すべての行yとすべての幅xをスキャンし、ピクセルのrgb部分がマスキング部分と一致すると次の変更を生成します(mpは行の先頭のポインターであり、0xffで事前に入力されています)。
*(mp +(x >> 3))&=〜(1 <<(x&7));
私はそれを本当に解釈することはできません。手を差し伸べるバックグラウンドを持っている人はいますか?
コードの外観から、mpは1ピクセルあたり1ビットの画像の現在の行を指します。このコードは、Xのピクセルを表すビットをクリアします。Xオフセットをバイトオフセット(x >> 3)に変換し、バイト内のX位置によって左にシフトされた逆1から作成されたマスクを使用してバイトを論理ANDします。
死すべき者のために; わかりました、背景:http ://www.cprogramming.com/tutorial/bitwise_operators.html; &=は、ビット単位の乗算を実行することを意味します。rhsでは、〜は補数を表すため、1を0に、またはその逆に反転します。バイナリの7は、最後に3つ、先頭にすべて0があるため、x&7はxの最後の3ビットを保持します。<<と組み合わせると、最初のビットの1がchar 1から左に、指数に従って特定の数の場所に移動します。指数はxの最後の3ビットのみを使用しているため、8(2 ^ 3)よりも小さくなります。したがって、1のビットは、charの8ビット内の1〜8の位置になります。フリップ〜は、その魔法の位置を除いて、物事をすべて1に変えます。&=によって実行される乗算は、1ビットを除くlhs内のすべてを保持します。今lhsのために; 右シフト操作で、xの最後のバイトまたは最後の3ビットを>>でキックします。これは、xの8増分ごとに同じバイト(mpのcharタイプ)を変更する場所を意味します。「ジャンプ」するときは、1バイトだけジャンプします。x=9の場合はmp+1になり、x=17の場合はmp+2になります。したがって、整数演算ではx / 2 ^ 3に似ていますが、1シフト演算ではです。さて、これで全体を理解するための要素ができました。
tmaskには0xffが事前に入力されています。これは、&=操作ではパッシブになり、rhsが指示する内容を保持することを意味します。これは、特定のピクセルが背景と等しいかどうかをチェックするifステートメントにヒットがあった場合、この行が実行され、ピクセルに関連する特定のビットがワイプされることを意味します。