2017-02-24 101 views
0

我对位操作相当陌生,所以如果你能帮助我,那就太棒了!当你比较两个不同的字节时,我明白了什么(&,|,〜,^)。我也明白,(< <)就像乘以2^i位一样,(>>)就等于除以2^i位。我已经尝试过,但我认为有更好的方法来做到这一点。家庭作业帮助(位操作)

这里的问题:

收件,用于设置一个整数一定数目的比特为1,并且所有其它位为0的值应该从函数返回的功能。例如,当将整数x = 3和y = 8传递给该函数时,该函数应该返回二进制数为00000000 00000000 00000111 11111000的整数。也就是说,将第3到第11(3 + 8)提示:此函数有两个参数:起始位数和从起始位开始计数的位数。应该使用逐位添加和移位。

这是我到目前为止有:

int function(int startBit, int numBits){ 
    int num = 0; 
    int num1 = 1; 
    int i; 

    for(i = startBit; i < startBit+numBits; i++){ 
      num = num | num1 << i; 

    } 
    return num; 
} 

提前感谢!

+0

忘记.......... –

回答

0

该解决方案是有点慢,但符合要求:

// First, create the number of 1 bits needed 
int result = 0; 
for (i = 0; i < numBits; ++i) 
    result = (result << 1) + 1; 

// Then shift the 1 bits to the correct position 
result <<= startBit; 
+0

唉,完美的非常感谢! –

0

通常位玩弄的是这样的:

((1 << numBits) - 1) << startBit 

,但我不知道你的满足“按位addtion和移位,应使用”的限制。

+0

时(1 << numBits) > INT_MAX它的价值将包裹OP的例子是64位,所以这只有在numBits <32(或在ILP64:numbits <64)时才有效。除此之外,这是一个很好的简化。 –

+0

是的,你一定要注意数据类型以及numBits和startBit的值,否则你会最终会出现错误的结果,这些类型的位有许多种,它们通常用于硬件控制寄存器的上下文中,其中numBits和startBit的值是常量,其值是re这个定义很明确。 –