C:在O(1)

时间:2017-02-23 13:30:06

标签: c bit-manipulation time-complexity bitwise-operators bit

现在,我知道设置数字的第i位的方法是使用移位运算符移位1直到达到所需位,然后只是或者数字。 但是这个过程是O(数字的长度),因为将数字移到第i个位置就像遍历那里,对吧? 如果我错了,请纠正我。

这是我的代码:

x = x| (1<<i)

有没有办法在O(1)中执行此操作? 换句话说,如何直接访问数字中的位? 我正在思考数组索引。

2 个答案:

答案 0 :(得分:5)

1移位k位是在硬件中完成的。在非常简化的级别上,n位CPU具有n个寄存器,表示在每个方向上移位0,1,2,...,n-1位的数字。执行移位操作时,CPU根据移位次数将数字加载到寄存器k中,并在下一个周期读取输出。这使得位移O(1)操作。

This Q&A有一张图解释了使用多路复用器的现代CPU的O(1)“神奇”背后的硬件。

答案 1 :(得分:2)

正如其他人所指出的,n |= 1 << i O(n)。这是因为大多数CPU中的位移操作是一条指令,就我所熟悉的指令而言需要一个或两个IIRC。

但是,如果你在C代码中引入了一个循环,那么当然这将是O(n),例如:

n = 1;
for(j = 0; j < i; ++j)
    n <<= 1;
x |= n;

对于通常在整数值中设置位的重构位设置,您可以执行以下操作:

typedef enum x_bits_e {
    x_bit1 = 1 << 0;
    x_bit2 = 1 << 1;
    x_bit3 = 1 << 2; 
     // and so on
};

int16_t set_bit_in_x(int16 x, x_bits_e i)
{ 
    return x | i;
}