2012-04-21 9 views
0

このコードは、画像の形をしたボタンを作成するのに役立つQtライブラリから来ています。ピクセルのrgb部分がマスキングの部分と一致するとき(mpは行の先頭のポインタであり、0xffであらかじめ指定されたポインタである)、画像処理ビット単位命令の概念的解釈

のときに、すべての行yとすべての幅xをスキャンします。

*(mp +(x >> 3))& =〜(1 < <(x & 7));

私はそれを本当に解釈できません。誰も手を差し伸べるための背景?

答えて

1

コードの外観から、mpは1ピクセルあたり1ビット画像の現在の行を指します。コードはXのピクセルを表すビットをクリアします.Xオフセットをバイトオフセット(x >> 3)に変換し、バイト内のX位置の左にシフトした逆数1から作成したマスクで論理積をとります。

0

; OK、背景:http://www.cprogramming.com/tutorial/bitwise_operators.html; & =ビット単位の乗算を行うことを意味します。 rhsでは、〜は補数のため、0と反対に1を反転します。バイナリで7は最後に3個、先頭にすべてゼロがあるので、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回のシフト演算ではx/2^3のようになります。さて、私たちは全体のことを理解する要素を持っています。

tmaskにはすべて0xffがあらかじめ設定されています。これは、& =操作時に受動的になり、rhsが何を指示しているかを保存することを意味します。つまり、特定のピクセルが背景と等しいかどうかをチェックするif文にヒットがある場合、この行が実行され、ピクセルに関連する特定のビットがワイプされます。