小白求助
编写一个函数,返回将无符号整数x的第pos位到第pos+n-位设为1后的值。假设x=64,pos=1;n=5,为什么最后x不是127?求大佬解惑{:10_303:}
unsigned set_n(unsigned x,int pos,int n)
{
int i;
for (i = 0;i <= n-1;i++){
unsigned mask = 1<<(pos-1+i);
x = x | mask;
}
return x;
} 问题出在代码中的位运算操作上。在循环中,我们使用了按位或运算符(|)将每个位的掩码(mask)与原始数值进行或运算,以将对应的位设为1。然而,我们没有考虑到已经设置为1的位。
在这个特定的例子中,当pos=1,n=5时,循环将执行5次,分别将第1位到第5位设为1。但是,由于x的初始值为64,二进制表示为"01000000",第6位已经是1。当我们将第6位设为1时,它并不会变成0,而是保持为1。因此,最终的结果不是127,而是"11000000",即192。
为了解决这个问题,我们需要在循环中添加一个条件,以跳过已经被设为1的位。以下是修改后的代码:
unsigned set_n(unsigned x,int pos,int n)
{
int i;
for (i = 0; i <= n-1; i++){
unsigned mask = 1<<(pos-1+i);
if ((x & mask) == 0) { // 检查当前位是否已经为1
x = x | mask;
}
}
return x;
}
现在,当我们运行该函数时,最终的结果将是127,即"01111111"。
页:
[1]