Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
什么是C中的位图?_C_Bitmap - Fatal编程技术网

什么是C中的位图?

什么是C中的位图?,c,bitmap,C,Bitmap,位图是一种图形。它是如何在C中实现的?我想你是在问如何在C中实现位图(或位数组)。令人惊讶的是,wikipedia上的条目描述了这个概念,但实际上并没有说明如何实现基本操作,所以这里是 简言之,创建一个您最喜欢的无符号类型的数组,并执行正确的算术来决定如何设置/清除其中的位 #include <limits.h> /* for CHAR_BIT */ #include <stdint.h> /* for uint32_t */ typedef uint32_t

位图是一种图形。它是如何在C中实现的?

我想你是在问如何在C中实现位图(或位数组)。令人惊讶的是,wikipedia上的条目描述了这个概念,但实际上并没有说明如何实现基本操作,所以这里是

简言之,创建一个您最喜欢的无符号类型的数组,并执行正确的算术来决定如何设置/清除其中的位

#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

literal
1
是一个有符号的常规
int
,这会引发两个问题:它不能保证为32位,而
1结构位图的实际大小将大于1位,因为它必须对齐——如果
sizeof(unsigned)
是4字节,那么
sizeof(struct BITMAP)
也是4字节。