二元操作,需要帮​​助

时间:2010-10-15 02:26:50

标签: c binary

我即将为程序创建一个函数,这是程序的一部分,并且是一个位图,用于保存哪些内存地址可以自由使用的控件(这与此函数无关) 。位图是位[64],其保持8×64位,下面的函数是取一个参数号,该参数号是该函数应占用的数据块的数量。在数组data_blocks []中,数字块的编号应为位值0(空闲)。

执行这个程序会产生一些奇怪的输出,而data_blocks []会给出超过512的值。有人可以帮我一把吗?感谢

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

    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[count] = 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);

    return 1;
}

1 个答案:

答案 0 :(得分:2)

k,从哪里开始...

1)“sizeof(char)”很可能是1.所以你有一个512字节的数组,而不是64字节的数组。

2)“bit”数组未初始化。

3)赋值“char x = bit [bitNum];”应该出现在循环内。

4)“strlen(bit)”没有做你想象的那样。它将“bit”解释为文本字符串。您可能想要使用“sizeof(bit)/ sizeof(char)”。

5)“(x&amp; 0)”总是评估为0.你想做什么?如果您正在尝试测试该位,则需要执行“!(x&amp; 1)”。

6)“int data_blocks [number]”:这甚至可以编译吗?如果在编译时不知道它的大小,则无法分配这样的本地数组。

7)if(count == number){                 打破;             }

只会让你脱离内循环。外循环继续不间断。

8)你真的想在外循环的每次迭代中将“count”重置为0吗?您是否希望代码在阵列中的某个位置找到3个空闲位置,或者在单个字节中找到3个空闲位置?