【发布时间】:2012-04-30 09:45:15
【问题描述】:
我正在编写一个 QuadTree 类,我需要包含邻居搜索。我正在关注this paper,其中包括一个 C 实现。 (我基本上是将其转换为 C#。)而且我遇到了麻烦,因为我不太擅长处理二进制数。我需要做以下事情:
给定#100 和#010,将它们组合得到#110。 1s 永远不会重叠。现在我所做的是存储 100 和 10,当我添加它们时,它会给我 110。
对#011 等数字执行左右二进制移位。现在我正在存储 011 并对其应用 >> 或
给定#011 和#001 将它们相加得到#100。现在我正在存储 11 和 1,这显然根本不起作用 .
执行按位减法,与上面相同,但 - 代替 + :)
执行 AND、OR 和 XOR。
所以,现在我将所有内容存储为看起来像二进制值的整数,并且数学似乎适用于 AND、OR、XOR 和移位。中间的数字很疯狂,但我最终得到了正确的答案。
我现在正在尝试一个实现,我存储整数值,它是二进制数的值,但我必须来回转换很多,这特别痛苦,因为我在整数表示之间进行转换数字的值和二进制数本身的字符串表示形式。每隔一行代码创建一个新字符串将是一场性能噩梦。
你们能推荐一个在 C# 中处理二进制数的基本策略吗?
附:我永远不需要看到这些数字的整数表示。我真的不在乎#010 == 2,我需要做的工作将其视为#010 故事的结尾。
希望这比我原来的帖子更清楚!
【问题讨论】:
-
你如何想象按位减法和整数减法是不同的?此外,如果将数字 10 存储在 int 中,则该数字是十进制的 10,永远不会是二进制的 10。
-
不要发布四叉树的一部分,而是用 C# 和 C 编写一个小的控制台应用程序并尝试展示具体的差异。
-
我的回复评论越来越长,所以我将尝试澄清原始帖子,感谢您的 cmets,我以前从未使用过二进制文件。 C 和 C# 可能工作方式相同,只是我不明白它们是如何工作的,所以我也会在控制台应用程序上工作。
-
没有“按位减法”之类的东西。减法只是 C# 或 C 中的减法。
-
当我在四叉树中有一个四边形并按照参考文件中的描述分配了二进制地址时,它的左侧邻居是四边形的地址 - 最小四边形宽度。因此,如果您允许 4 级树,则四边形 #011 的左侧邻居是 #011 - #001。该操作的名称是什么?
标签: c# binary bit-manipulation