1

我正在编写一个 QuadTree 类,我需要包括邻居搜索。我正在关注包括 C 实现的这篇论文。(我基本上是将其转换为 C#。)而且我遇到了麻烦,因为我不太擅长处理二进制数。我需要做以下事情:

给定#100 和#010,将它们组合得到#110。1s 永远不会重叠。现在我所做的是存储 100 和 10,当我添加它们时,它给了我 110。

对 #011 等数字执行左右二进制移位。现在我正在存储 011 并对其应用 >> 或 << 运算符。这给了我一个完全错误的数字,但奇怪的是,我用它来寻找常见的四叉树父母的逻辑工作得很好。

给定#011 和#001 将它们相加得到#100。现在我正在存储 11 和 1,这显然根本不起作用。

执行按位减法,与上面相同,但 - 而不是 + :)

执行 AND、OR 和 XOR。

因此,现在我将所有内容存储为看起来像二进制值的整数,并且数学似乎适用于 AND、OR、XOR 和移位。中间的数字很疯狂,但我最终得到了正确的答案。

我现在正在尝试一个实现,我存储整数值,它是二进制数的值,但我必须来回转换很多,这特别痛苦,因为我在值的整数表示之间进行转换数字和二进制数本身的字符串表示形式。每隔一行代码创建一个新字符串将是一场性能噩梦。

你们能推荐一个在 C# 中处理二进制数的基本策略吗?

PS我不需要看到这些数字的整数表示。我真的不在乎#010 == 2,我需要做的工作将其视为#010 故事的结尾。

希望这比我原来的帖子更清楚!

4

3 回答 3

3

我希望这会消除一些混乱:

  • 文字0x00000001使用十六进制表示法表示 1。
  • 文字1使用十进制表示法表示 1。

下面是一些对等的字面量:

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

原始整数数据类型(byte、sbyte、ushort、short、char、uint、int、ulong、long)始终以二进制格式存储在计算机内存中。 以下是用五位表示的上述值:

 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;

要将二进制文件分配给#10uint 变量,请执行以下操作:

uint binaryOneZero = 2;   //or 0x2

十六进制表示法对位操作很有用,因为十六进制和二进制数字之间存在一对一的对应关系。更准确地说,存在一对四的对应关系,因为 16 个十六进制数字中的每一个都代表 4 位的 16 种可能状态之一:

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,例如,具有最低有效字节集的所有位,没有下一个最高有效字节,以及下一个最高有效字节的低三位。459007如果您使用文字来表示该值,则很难一目了然地看到该信息。

综上所述:

你们能推荐一个在 C# 中处理二进制数的基本策略吗?

学习上表,并使用十六进制文字。

于 2012-04-18T22:55:15.387 回答
2

为什么那条感兴趣的行在 C 中进行按位减法,但在 C# 中进行整数减法。

他们都应该这样做。为什么你不这么认为?你对按位减法是什么意思?

我将二进制数 10 存储为整数 10,而不是整数 2。我可能做错了。

是的,那是错误的。#010 == 2,而不是 10。

我想我要寻找的是在 C# 中处理二进制数的一些基本策略。

总的来说,这些操作应该与 C 中的相同。

于 2012-04-18T21:57:57.617 回答
1

您标记的行与按位无关。它是数字 1 的直接减法(表示为十六进制双字 (DWORD) 或无符号长整数(C# 中的 uint)。

于 2012-04-18T22:00:24.497 回答