C中的位图,二进制运算

时间:2010-10-17 17:50:53

标签: c binary bitmap

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

Under是一些执行某些工作的代码:除了在函数内部声明了char位[512/8],因此当我调用occupyDataBlocks时会声明数组,这会产生相同的输出并且在我的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;
}

3 个答案:

答案 0 :(得分:1)

我不确定,你想做什么,阅读你的代码。 无论是太混乱还是太忙。

1。)如果你想要从一个以上的循环“中断”,你可能想为循环编写一个辅助函数,而是“返回”。

2。)我不确定你是否知道这个:b ++表示:返回b的值然后再增加变量。

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

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

3。)运营商&amp;和|和^是按位,&amp;&amp;和||而且!是布尔运算符,它隐含地将0 / NULL转换为false / 0,将其他所有内容转换为true / 1。因此,(x&amp; 0)总是等于0,而!(x&amp; 0)等于1。

4。)我对此并不确定,我的C知识不完整:这有什么价值:

((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]))

答案 1 :(得分:0)

可能有所帮助的一些要点:

  • 声明“可变大小的数组”(例如int data_blocks[ab];)无效C(C99除外)。您可能需要使用malloc()
  • (x & 0) 始终等于0
  • if (count == number)没有任何意义。
  • 如果没有足够的空闲位,你需要弄清楚会发生什么。

答案 2 :(得分:0)

正如您所提到的,数组bit需要在函数occupyDataBlocks()之外维护状态。对于此程序,您可以在main()中定义它们并将其作为

传递给函数
int main() {

    unsigned char bit[512/8];      // Note: unsigned

    occupyDataBlocks( bit, 3 );
    occupyDataBlocks( bit, 3 );
}

我仍然不清楚为什么int data_blocks[]数组。如果您使用更精确的要求和两个示例更新您的问题,那么我可以提供更好的建议。