使用给定的移位更改数字中的 4 位
Changing 4 bits in a number with a given shift
我有一个十进制数,我需要用给定的移位操作 4 位。
例如,如果数字是 208,即二进制 11010000,我想将 4 位更改为 1101,移动 2。新数字将是 244。
当变化是:11110100。
这是我的代码:
void change_bit(int num, int bit, int shift)
{
num = (num & (0xfffffff0<<shift)) | (bit << shift);
printf("%d\n", num);
}
0xfffffff0 的移动只是在左边的大小上增加了'0'。
我该如何解决?
如果将复杂的表达式拆分成更小的部分,会更容易。它不会影响代码的效率,但会更容易阅读和理解。
unsigned change_bit(unsigned num, unsigned bit, int shift)
{
unsigned mask = ((1U << 4) - 1) << shift; // mask to reset the bits at the position
num &= ~mask; //reset the bits
num |= bit << shift; //set the bits
return num;
}
或更普遍
unsigned change_bit(unsigned num, unsigned newval, int shift, int numbits)
{
unsigned mask = ((1 << numbits) - 1) << shift;
num &= ~mask;
num |= newval << shift;
return num;
}
和一些测试代码:
void print(unsigned val)
{
for(unsigned x = 1U << 31; x ; x >>= 1)
{
printf("%d", !!(val & x));
}
printf("\n");
}
int main(void)
{
print(208);
print(change_bit(208, 0b1101, 2));
printf("%d\n", change_bit(208, 0b1101, 2));
}
您还应该添加一些参数检查。
我有一个十进制数,我需要用给定的移位操作 4 位。 例如,如果数字是 208,即二进制 11010000,我想将 4 位更改为 1101,移动 2。新数字将是 244。 当变化是:11110100。 这是我的代码:
void change_bit(int num, int bit, int shift)
{
num = (num & (0xfffffff0<<shift)) | (bit << shift);
printf("%d\n", num);
}
0xfffffff0 的移动只是在左边的大小上增加了'0'。 我该如何解决?
如果将复杂的表达式拆分成更小的部分,会更容易。它不会影响代码的效率,但会更容易阅读和理解。
unsigned change_bit(unsigned num, unsigned bit, int shift)
{
unsigned mask = ((1U << 4) - 1) << shift; // mask to reset the bits at the position
num &= ~mask; //reset the bits
num |= bit << shift; //set the bits
return num;
}
或更普遍
unsigned change_bit(unsigned num, unsigned newval, int shift, int numbits)
{
unsigned mask = ((1 << numbits) - 1) << shift;
num &= ~mask;
num |= newval << shift;
return num;
}
和一些测试代码:
void print(unsigned val)
{
for(unsigned x = 1U << 31; x ; x >>= 1)
{
printf("%d", !!(val & x));
}
printf("\n");
}
int main(void)
{
print(208);
print(change_bit(208, 0b1101, 2));
printf("%d\n", change_bit(208, 0b1101, 2));
}
您还应该添加一些参数检查。