1

QuadTreeクラスを作成していますが、ネイバー検索を含める必要があります。私は、Cの実装を含むこのペーパーに沿ってフォローしています。(基本的にはC#に変換しています。)そして、2進数の操作があまり得意ではないため、問題が発生しています。私は次のことをする必要があります:

#100と#010が与えられたら、それらを組み合わせて#110を取得します。1が重なることはありません。今私がしているのは100と10を保存することです。それらを追加すると、110になります。

#011のような数値に対して左右の2進シフトを実行します。今、私は011を保存し、それに>>または<<演算子を適用していました。これは私に完全に間違った数を与えますが、奇妙なことに、一般的な四分木親を見つけるためにそれを使用したロジックはうまく機能していました。

与えられた#011と#001は、それらを合計して#100を取得します。現在、11と1を保存していますが、これは明らかにまったく機能しません。

上記と同じですが、+の代わりに-ビット単位の減算を実行します:)

AND、OR、およびXORを実行します。

したがって、現在、すべてを2進値のように見える整数として格納しており、数学はAND、OR、XOR、およびシフトに対して機能しているようです。数字は真ん中で狂っていますが、私は最終的に正しい答えを得ることができます。

私は今、2進数の値である整数値を格納する実装を試みていますが、何度も変換する必要があります。値の整数表現間で変換しているため、これは特に苦痛です。 2進数自体の数値と文字列表現の。コードの2行ごとに新しい文字列を作成することは、パフォーマンスの悪夢になります。

C#で2進数を操作するための基本的な戦略をお勧めできますか?

PS私はこれらの数の整数表現を見る必要はありません。#010 == 2であることは本当に気にしません。私がしなければならない作業は、それを#010の話の終わりと見なします。

うまくいけば、これは私の元の投稿よりも明確です!

4

3 に答える 3

3

これで混乱が解消されることを願っています。

  • リテラル0x00000001は、16進表記を使用して1を表します。
  • リテラル1は、10進表記を使用して1を表します。

同等のリテラルのペアを次に示します。

 0x9 ==  9
 0xA == 10
 0xF == 15
0x10 == 16
0x11 == 17
0x1F == 31

プリミティブ整数データ型(byte、sbyte、ushort、short、char、uint、int、ulong、long)は、常にバイナリ形式でコンピューターのメモリに格納されます。 上記の値は5ビットで表記されています。

 1 == #00001
 9 == #01001
10 == #01010
15 == #01111
16 == #10000
17 == #10001
31 == #11111

ここで、次のことを考慮してください。

unsigned int xLeftLocCode = xLocCode - 0x00000001;

次のいずれかがC#で同等です。

uint xLeftLocCode = xLocCode - 1;
uint xLeftLocCode = xLocCode - 0x00000001;

バイナリ#10をuint変数に割り当てるには、次のようにします。

uint binaryOneZero = 2;   //or 0x2

16進数と2進数の間には1対1の対応があるため、16進表記はビット操作に役立ちます。より正確には、16桁の16進数のそれぞれが、4ビットの16の可能な状態の1つを表すため、1対4の対応があります。

0 ==  0 == 0000
1 ==  1 == 0001
2 ==  2 == 0010
3 ==  3 == 0011
4 ==  4 == 0100
5 ==  5 == 0101
6 ==  6 == 0110
7 ==  7 == 0111
8 ==  8 == 1000
9 ==  9 == 1001
A == 10 == 1010
B == 11 == 1011
C == 12 == 1100
D == 13 == 1101
E == 14 == 1110
F == 15 == 1111

0x700FFしたがって、たとえば、最下位バイトセットのすべてのビットがあり、次の最上位バイトはなく、次の最上位バイトの下位3ビットがあることを知るのはかなり簡単です。459007リテラルを使用してその値を表す場合、その情報を一目で確認するのははるかに困難です。

結論は:

C#で2進数を操作するための基本的な戦略をお勧めできますか?

上記の表を学び、16進リテラルを使用してください。

于 2012-04-18T22:55:15.387 に答える
2

その関心のある行がCではビット単位の減算を行うのにC#では整数の減算を行うのはなぜですか。

どちらも同じようにする必要があります。なぜあなたはそうではないと思いますか?そして、ビット単位の減算とはどういう意味ですか?

2進数の10を整数2ではなく整数10として格納しています。これはすべて間違っている可能性があります。

はい、それは間違っています。#010 == 2、10ではありません。

私が探しているのは、C#で2進数を操作するための基本的な戦略だと思います。

概して、これらの操作はCの場合と同じである必要があります。

于 2012-04-18T21:57:57.617 に答える
1

マークした行は、ビット単位の何かとは何の関係もありません。これは、数値1(16進ダブルワード(DWORD)、または符号なし長整数(C#ではuint)として表される)の単純な減算です。

于 2012-04-18T22:00:24.497 に答える