什么是C中的位图?
位图是一种图形。它是如何在C中实现的?我想你是在问如何在C中实现位图(或位数组)。令人惊讶的是,wikipedia上的条目描述了这个概念,但实际上并没有说明如何实现基本操作,所以这里是 简言之,创建一个您最喜欢的无符号类型的数组,并执行正确的算术来决定如何设置/清除其中的位什么是C中的位图?,c,bitmap,C,Bitmap,位图是一种图形。它是如何在C中实现的?我想你是在问如何在C中实现位图(或位数组)。令人惊讶的是,wikipedia上的条目描述了这个概念,但实际上并没有说明如何实现基本操作,所以这里是 简言之,创建一个您最喜欢的无符号类型的数组,并执行正确的算术来决定如何设置/清除其中的位 #include <limits.h> /* for CHAR_BIT */ #include <stdint.h> /* for uint32_t */ typedef uint32_t
#include <limits.h> /* for CHAR_BIT */
#include <stdint.h> /* for uint32_t */
typedef uint32_t word_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;
}
#包含/*字符位*/
#包括/*用于uint32\u t*/
typedef uint32\u t word\t;
枚举{BITS_PER_WORD=sizeof(WORD_t)*CHAR_BIT};
#定义字偏移量(b)((b)/每个字的位)
#定义位偏移量(b)((b)%每个字的位)
无效集合位(字*words,int n){
单词[WORD_OFFSET(n)]|=(1您可以使用“位字段”
$cat src/bitmap.c
#包括
#定义第4位
结构位图{
无符号值:1;
}位[位];
int main(){
位[0]。值=0;
位[1]。值=1;
//从“int”到位字段的隐式截断将值从2更改为0[-Wbit/字段常量转换]
位[2]。值=2;
位[3]。值=3;
int i;
对于(i=0;i
结果
$gcc src/bitmap.c-lm-o位图&&./bitmap
src/bitmap.c:在函数“main”中:
src/bitmap.c:14:24:警告:从“int”到“unsigned char:1”的无符号转换将值从“2”更改为“0”[-Woverflow]
14 |位[2]。值=2;
| ^
src/bitmap.c:15:24:警告:从“int”到“unsigned char:1”的无符号转换将值从“3”更改为“1”[-Woverflow]
15 |位[3]。值=3;
| ^
位0的值为0
位1的值为1
第2位的值为0
第3位的值为1
literal1
是一个有符号的常规int
,这会引发两个问题:它不能保证为32位,而1结构位图的实际大小将大于1位,因为它必须对齐——如果sizeof(unsigned)
是4字节,那么sizeof(struct BITMAP)
也是4字节。