如果第一位为 1,则设置整个字节

Set whole byte if first bit is 1

我正在尝试制作程序,例如 273(000100010001b) 制作成 4095(111111111111b)

有趣的是,我的程序在前 2 次迭代中工作,例如 17(00010001b) 正确 returns 255(11111111b) 但之后的每个字节都不起作用。例如 273(000100010001b) returns 61951(1111000111111111b) 我不知道为什么会这样。

这是我的代码

int x,temp, i;
int mask = 15;
scanf_s("%d", &x);
temp = x;
for(i=0;i<4;i++){
    mask<<=i*4;
    if((temp&1)==1){
        x|=mask;
    } else{

    }
    temp>>=4;
    }
printf("%d", x);

问题是您在 mask 上执行的轮班。您在第一次迭代时将其移动 0,在第二次迭代时移动 4,在第三次迭代时移动 12 (4 + 8),依此类推。

此外,您没有在 temp 的所有位上应用掩码。我不知道你是不是故意的。

这里是固定版本:

int foo(int x) {
/*  ^ I didn't know how to call such function */
    static size_t const mask_size = 4;
    unsigned mask = 15;

    int temp = x;
    for (unsigned i = 0; i < (CHAR_BIT * sizeof(int)) / mask_size; ++i) {
        if ((temp & 1) == 1) {
            x |= mask;
        }
        mask <<= mask_size;
        temp >>= mask_size;
    }

    return x;
}

我的结果是:

in:  17(10) = 10001(2)
out: 255(10) = 11111111(2)
in:  273(10) = 100010001(2)
out: 4095(10) = 111111111111(2)
in:  4369(10) = 1000100010001(2)
out: 65535(10) = 1111111111111111(2)