【发布时间】:2011-02-02 05:01:41
【问题描述】:
(这不是CS课作业,即使看起来很像)
我使用位域来表示 0 到 22 之间的范围。例如,作为输入,我有几个不同的范围(顺序无关紧要)。我使用. 表示0 和X 表示1 以获得更好的可读性。
.....XXXXX..............
..XXXX..................
.....XXXXXXXXXXXXXXX....
........XXXXXXX.........
XXXXXXXXXXXXXXXXXXXXXXXX
位域范围的数量通常低于 10,但可能会高达 100。根据该输入,我想计算互斥的连续范围,如下所示:
XX......................
..XXX...................
.....X..................
......XX................
........XX..............
..........XXXXX.........
...............XXXXX....
....................XXXX
(同样,输出顺序无关紧要,它们只需要互斥且连续,即它们不能有漏洞。.....XXX.......XXXXX.... 必须分成两个单独的范围)。
我尝试了几种算法,但最终都变得相当复杂和不雅。对我有极大帮助的是一种检测.....XXX.......XXXXX.... 有孔的方法以及一种确定孔中一个位的索引的方法。
编辑:位域范围代表地图上的缩放级别。它们旨在用于为 Mapnik(OpenStreetMap 使用的平铺渲染系统等)输出 XML 样式表。
【问题讨论】:
-
您能否更具体地说明您如何尝试将位划分为范围?我很乐意提供帮助,但我不太了解您在示例中是如何提出范围的。
-
我会投票赞成这个问题,因为你激发了我的好奇心。你愿意分享它的用途吗?
-
我得到所需解决方案的方法大致如下:取一个垂直列并与下一个比较,如果它在所有行中都相同,它仍然在前一个列范围内。如果至少有一项不同,则开始新的范围。问题是输入可能有 100 行左右。
-
同意 xelco52,这个问题对我来说听起来很有趣,但我无法完全理解。我看到第一个块有 5 个位域(第 5 个位域全为 1),每个宽度为 22。“互斥、连续范围”转换如何恰好到达宽度为 22 的第二个 8 个位域块?
标签: c++ range bit-fields