如果第一位为 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)
我正在尝试制作程序,例如 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)