0

この式は、Leptonica (画像処理ライブラリ) の組み込み関数 "l_setDataByte" から取得されます。

リンクは次のとおりです: http://tpgit.github.io/Leptonica/arrayaccess_8c_source.html (Line-260 here)

*(l_uint8 *)((l_uintptr_t)((l_uint8 *)line + n) ^ 3) = val;
4

1 に答える 1

0

私の推測:

  • 行は符号なし 8 ビット (バイト) へのポインターです。(l_uint8 *)line
  • 行の n 番目のバイトを操作します: (l_uint8 *)line + n --> y (y はポインタです)
  • ただし、符号なし整数ポインターとしてキャストした後、アドレスの最後の 2 ビットを XOR します。(l_uintptr_t)y ^ 3--> z (z はポインター)
  • 最後に、符号なしバイト ポイントにキャスト バックし、valそこに値を書き込みます。*(l_uint8 *)z = val

編集: ^3 は、バイトの配置に対処することです (つまり、リトルエンディアンとビッグエンディアン)。数値 0x12345678 は、0x12、0x34、0x56、0x78 (ビッグ エンディアン) または 0x78、0x56、0x34、0x12 (リトル エンディアン) の 2 つの方法で連続したバイトに入れることができます。XOR はビッグ エンディアン アドレッシング (274 行を参照) からリトルエンディアン (276 行) に切り替わります。これはプロセッサに依存し、ソースは何らかの方法でコンパイルされます。

于 2013-08-01T15:45:59.937 に答える