【发布时间】:2018-03-12 07:35:12
【问题描述】:
我对这个程序的目标是我希望能够将 1000 位分别设置为 0 或 1,为此我使用的是 128 位整数数组。
现在的问题是,当我简单地清除_bit(3) 时,第 35 位也被清除(反之亦然)。 3 和 35 总是一起清除,4 和 36、5 和 37 等也是如此。所以显然有一个模式。我只想清除 3 而其余的保持 1。
任何想法为什么会发生这种情况?谢谢!
#include <stdio.h>
__uint128_t array [(1000/128) + 1];
// Set bit to 0.
void clear_bit(int k)
{
array[k/128] &= ~(1 << (k%128));
}
// Find the value of bit.
int test_bit(int k)
{
return((array[k/128] & (1 << (k%128) )) != 0);
}
// Set bit to 1.
void set_bit(int k)
{
array[k/128] |= 1 << (k%128); // Set the bit at the k-th position in A[i]
}
int main (void)
{
// Set all bits to 1.
for(int i = 0; i < 40; i++) {
set_bit(i);
}
// I want to clear bit 3, but it also clears 35 for an unknown reason.
clear_bit(3);
for(int i = 0; i < 40; i++) {
printf("%d is now:%d\n", i, test_bit(i));
}
return (0);
}
【问题讨论】:
-
~(1 << (k%128))的任何部分都不是 __uint128_t 数学。如果您想使用 __uint128_t,则需要注意如何将 int 与它们混合。 -
1 << (k%128)-->((__uint128_t)1) << (k%128)。海事组织,使用unsigned -
@chux 哇,谢谢老兄,你解决了我的全部问题!把它放在一个答案中,我会接受它。 ;) 另外,“使用无符号”是什么意思,我们已经在使用无符号 int128 了,不是吗?
-
1) 考虑
#define UNS_WIDTH (CHAR_BIT*sizeof(unsigned)) unsigned array [(1000 + UNS_WIDTH - 1)/UNS_WIDTH]; ... array[k/UNS_WIDTH] &= 1u << (k%UNS_WIDTH); -
我会使用自己的平台整数的本机大小(32 或 64)来代替。 .
标签: c integer bit-manipulation bit int128