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

时间:2017-12-12 06:47:42

标签: c bitmap 64-bit

我正在尝试在C中实现位图数组。 我已通过此链接阅读并复制粘贴:What is a bitmap in C?

#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;
}

使用uint32_t,代码运行良好。它分别打印x值:1,3和7,如下所示:

[izzatul@mycomputer latihan]$ ./a.out
sizeof(word_t)=8
CHAR_BIT=8
BITS_PER_WORD=64
x=1
x=3

X = 7

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

我知道&#34;&lt;&lt;&#34;是位移位,这意味着您将位向左移位(或向右移0)。 但我仍然不确定如何自己修改代码。

1 个答案:

答案 0 :(得分:1)

问题是代码使用int整数常量。所有这些整数常量都有类似变量的类型,默认为int32_t,这可能与系统上的int32_t相同。

左移一个有符号整数,如1 << BIT_OFFSET(n)超过30位会调用未定义的行为,因为您将把数据移入符号位。根据经验,永远不要将带符号的变量和按位运算符一起使用。

在这种情况下,正确的解决方法是将(word_t)1 << BIT_OFFSET(n) 的每个实例替换为:

1ull

或者使用printf("x=%"PRIu64 "\n",x);后缀,但这可能会在较小的系统上产生不必要的慢速代码。

请注意,printf的正确格式说明符是inttypes.h中的a=eval(input('Provide the height of the box: ')) b=eval(input('Provide the width of the box: ')) d=a-2 r=b-2 if a >= 1: print('*'*b) if a > 1: for i in range(d): print('*',end='') for i in range(r): print(' ',end='') print('*') print('*'*b,end='')