【发布时间】:2016-02-27 21:10:43
【问题描述】:
我有一个长的位序列存储在一个无符号长整数数组中,像这样
struct bit_array
{
int size; /* nr of bits */
unsigned long *array; /* the container that stores bits */
}
我正在尝试设计一种算法来反转 *array 中的位顺序。问题:
-
size可以是任何值,即不一定是 8 或 32 等的倍数,因此输入数组中的第一位可以在输出数组中 unsigned long 内的任何位置结束; - 算法应该独立于平台,即适用于任何
sizeof(unsigned long)。
代码、伪代码、算法描述等 - 任何比蛮力(“一点一点”)方法更好的方法都是受欢迎的。
【问题讨论】:
-
"[T]输入数组中的 first 位可以在输出数组的 unsigned long 内的任何位置结束"?我不确定我是否理解。第一位不会在第一个长的第一个位置吗?你不是说最后位吗?
-
我认为问题在于,如果位数组中有 57 位,则位号 0 需要与位号 56 交换。但是,在我们做任何事情之前,我们需要知道位是否数组的 0 存储在数组元素 0 的 MSB 或 LSB 中(或者,如果元素 0 不在位 0 的位置,我们需要了解位 0 的存储位置)。
-
@Jonathan 和 Eques:啊哈,这是关于颠倒顺序!我以为它只是在反转每一位。很抱歉造成误解。
-
为什么不在结构中添加额外的两个字段来定义要跳过的方向和位数?然后创建程序来访问它取决于方向?
-
你可以控制这个结构的定义吗?如果你这样做了,为什么要将位存储在
unsigned long *,而不是uint8_t *。这将排除平台相关问题。