Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用uint64\t数据类型在C中实现位图数组?_C_Bitmap_64 Bit - Fatal编程技术网

如何使用uint64\t数据类型在C中实现位图数组?

如何使用uint64\t数据类型在C中实现位图数组?,c,bitmap,64-bit,C,Bitmap,64 Bit,我正在尝试用C语言实现位图数组。 我已阅读并复制了此链接中的粘贴: x=7 它不起作用。x值变成1295807169等,这不是我所期望的。我希望它和以前一样(1,3,7)。有人能帮我修复那个代码吗 我知道“问题是代码使用了1整数常量。所有这些整数常量的类型与变量类似,并且是默认的int,这可能与系统上的int32\t相同 将有符号整数(如int32\t左移超过30位)调用未定义的行为,因为您将把数据移到有符号位。根据经验,不要将有符号变量与按位运算符一起使用 在这种情况下,正确的修复方法是替换1

我正在尝试用C语言实现位图数组。 我已阅读并复制了此链接中的粘贴:

x=7

它不起作用。x值变成1295807169等,这不是我所期望的。我希望它和以前一样(1,3,7)。有人能帮我修复那个代码吗


我知道“问题是代码使用了
1
整数常量。所有这些整数常量的类型与变量类似,并且是默认的
int
,这可能与系统上的
int32\t
相同

将有符号整数(如
int32\t
左移超过30位)调用未定义的行为,因为您将把数据移到有符号位。根据经验,不要将有符号变量与按位运算符一起使用


在这种情况下,正确的修复方法是替换
1的每个实例,它是蓝色的,但
1
是一个
int
常量。强制转换可能有帮助,例如:
(word\t)1
。否则,您的部分计算可能在
int
中完成,而部分计算可能在
uint64\u t
中完成,这可能会产生副作用。我建议您以十六进制打印位值,这会让您更好地了解正在进行的操作。在printf调用中使用%x(同样,printf也不希望使用64位类型,除非您使用ll size修饰符告诉它,因此printf(“x=%llx\n”,x);否则您将只获得值的高32位或低32位(取决于系统端度)部分。请注意,您没有将
x
设置为已知值(如
0
)在开始设置位之前。当您开始设置不确定值时,会得到不确定的结果。也可能值得以十六进制打印结果,而不是以十进制打印结果。如果以十六进制打印,则更容易看到1295807169(基数10)等数字作为位模式。
#include <limits.h>    /* for CHAR_BIT */
#include <stdint.h>   /* for uint32_t */
#include <stdio.h>
#include <stdlib.h>

typedef uint32_t word_t; // I want to change this, from uint32_t to uint64_t
enum { BITS_PER_WORD = sizeof(word_t) * CHAR_BIT };
#define WORD_OFFSET(b) ((b) / BITS_PER_WORD)
#define BIT_OFFSET(b)  ((b) % BITS_PER_WORD)

void set_bit(word_t *words, int n) { 
  words[WORD_OFFSET(n)] |= (1 << BIT_OFFSET(n));
}

void clear_bit(word_t *words, int n) {
  words[WORD_OFFSET(n)] &= ~(1 << BIT_OFFSET(n)); 
}

int get_bit(word_t *words, int n) {
  word_t bit = words[WORD_OFFSET(n)] & (1 << BIT_OFFSET(n));
  return bit != 0; 
}

int main(){
  printf("sizeof(word_t)=%i\n",sizeof(word_t));
  printf("CHAR_BIT=%i\n",CHAR_BIT);
  printf("BITS_PER_WORD=%i\n",BITS_PER_WORD);
  word_t x;

  set_bit(&x, 0);
  printf("x=%u\n",x);
  set_bit(&x, 1);
  printf("x=%u\n",x);
  set_bit(&x, 2);
  printf("x=%u\n",x);

  return 0;
}
[izzatul@mycomputer latihan]$ ./a.out
sizeof(word_t)=8
CHAR_BIT=8
BITS_PER_WORD=64
x=1
x=3
(word_t)1 << BIT_OFFSET(n)