【问题标题】:Binary operation, need help二进制操作,需要帮​​助
【发布时间】:2010-10-15 10:51:35
【问题描述】:

我要为程序创建一个函数,这是程序的一部分,是一个位图,用于控制哪些内存地址可以免费使用(这与此函数无关) .位图是 bit[64],它拥有 8 x 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;
}

【问题讨论】:

    标签: c binary


    【解决方案1】:

    k,从哪里开始...

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

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

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

    4) "strlen(bit)" 没有按照你的想法做。它将“位”解释为文本字符串。你可能想要使用“sizeof(bit)/sizeof(char)”。

    5) "(x & 0)" 总是计算为 0。你想做什么?如果您尝试测试该位,则需要执行“!(x & 1)”。

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

    7) if(count == number) { 休息; }

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

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

    【讨论】:

    • 谢谢。代码现在将编译并运行,它给了我一个看起来正确的结果。我希望代码在数组中找到 3 个空闲位置,因为我们使用的是位图而不是字节图。
    • sizeof(char)“最有可能是1”有点像说“氢的核中最有可能有一个质子”。
    • 哈哈。好吧,我的意思是 char 很可能是 1 个字节。 sizeof(char) 根据定义确实是 1。
    • 嗨。我相信我的回应是说这项工作我想要的方式是快速的。我要做的是创建一个控制 512 位的位图,当它的 0 和占用 1 时,一个位准备好使用:我们有一个数组 char bit[64] 即位图。函数occupDataBlocks(int number) 应该搜索bit[],找到一个空闲位(0),将该位设置为占用(1),并将0 到512 之间的位的位置放入数组dataBlocks[0]。我们如何获得实现这一目标的代码?如果你从 main 调用 accupyDataBlocks(5) 两次,你会得到完全相同的结果。
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 2012-09-21
    • 1970-01-01
    • 2022-10-15
    • 2018-04-30
    • 2020-06-10
    • 2023-03-19
    • 2013-10-09
    相关资源
    最近更新 更多