gpt4 book ai didi

c - C 中的位图,二进制运算

转载 作者:行者123 更新时间:2023-11-30 16:03:35 24 4
gpt4 key购买 nike

我即将创建一个控制 512 位的位图,所有 512 位都应该为 0,以表明程序启动时该位是空闲的。函数habitDataBlocks(int number)应该找到空闲位,将该位放入数组int data_blocks[]中,并将占用位设置为1。

下面是一些完成一些工作的代码:除了 char bit[512/8] 是在函数内部声明的,因此当我调用占领数据 block 时将声明数组,这会产生相同的输出,并且在我的prog,当我尝试将 char 位声明为全局变量时,程序返回没有足够的内存。

我需要帮助来获取实现此目的的代码,并将该位设置为占据。请帮我编码,我了解解决方案,但无法用 C 语言表达。

        #include <stdio.h>
#include <string.h>

void occupyDataBlocks(int number)
{

int ab = number;

char bit[512/8];

int bitNum = 0;

int count;

int data_blocks[ab];

int b = 0;

for(bitNum = 0; bitNum < (sizeof(bit)/sizeof(char)); bitNum++) {
char x = bit[bitNum];

for(count = 0; x != 0; x >>= 1 ) {
if(!(x & 0)) {
data_blocks[b++] = count;
}

if(count == number) {
break;
}
count++;
}
if(count == number) {
break;
}
}

if(count == number) {
int a;

for(a = 0; a < 5; a++) {
printf("%d\n", data_blocks[a]);
}

} else {
printf("Not enough data blocks\n");
}
}

int main(void)
{
occupyDataBlocks(3);
occupyDataBlocks(3);


return 1;
}
<小时/>
#include <stdio.h>
#include <string.h>

int occupyDataBlocks(char bit, int number)
{

int ab = number;

int bitNum = 0;

int count;

int data_blocks[ab];

int b = 0;

for(bitNum = 0; bitNum < (sizeof(bit)/sizeof(char)); bitNum++) {
char x = bit[bitNum];

for(count = 0; x != 0; x >>= 1 ) {
if(!(x & 0)) {
data_blocks[b++] = count;
}

if(count == number) {
break;
}
count++;
}
if(count == number) {
break;
}
}

if(count == number) {
int a;

for(a = 0; a < 5; a++) {
printf("%d\n", data_blocks[a]);
}

} else {
printf("Not enough data blocks\n");

return 0;
}

return 1;
}

int main(void)
{
unsigned char bit[512/8];

/*
* I need 3 data blocks that is ready for me to use. Put the position to the free data block in array data_blocks[],
* where data_blocks[0] can be 100 (the first free data block), data_block[1] = 400 (second free datablock) etc.
*
*/

int data_blocks[3];
memcpy(data_blocks, occupyDataBlocks(bit, 3), sizeof(data_blocks));/* A try to copy the result of occypyDataBlocks to data_blocks*/

return 1;
}

最佳答案

我不确定你想做什么,阅读你的代码。要么太困惑,要么太错误。

1.) 如果您想“打破”多个循环,您可能需要为循环编写一个辅助函数,然后“返回”。

2.) 我不确定你是否知道这一点:b++ 的意思是:返回 b 的值,然后递增变量。

b++ equals:
{int x=b; b=b+1; return x;}

++b equals:
{b=b+1; return b;}

3.) 运算符 & 和 |和 ^ 是按位,&& 和 ||和 !是 bool 运算符,它们隐式地将 0/NULL 转换为 false/0,将其他所有内容转换为 true/1。因此,(x & 0) 始终等于 0,而 !(x & 0) 等于 1。

4.)我对此不太确定,我的 C 语言知识不完整:这有什么值(value):

((signed char)0xff) >> 1  == 0xff
or
((signed char)0xff) >> 1 == 0x7f

字符正式既不是有符号字符也不是无符号字符;它们是不同的类型,可能类似于有符号或无符号字符,具体取决于编译器。

5.) 此代码等于:

for(a,aa;b;c,cc)d,dd;

{a;aa; while(b){d;dd;c;cc;} }

使用 for 代替 while 可能会使事情变得清晰,但是应该明确使用 for 的这三个参数来使事情变得清晰。对于编译器来说这不是那么相关,但是对于读者来说。

6.) sizeof(char) 始终为 1。您可能想要写的是这样的: (sizeof(myarray)/sizeof(myarray[0]))

关于c - C 中的位图,二进制运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3954469/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com