现在,我知道设置数字的第i位的方法是使用移位运算符移位1直到达到所需位,然后只是或者数字。 但是这个过程是O(数字的长度),因为将数字移到第i个位置就像遍历那里,对吧? 如果我错了,请纠正我。
这是我的代码:
x = x| (1<<i)
有没有办法在O(1)中执行此操作? 换句话说,如何直接访问数字中的位? 我正在思考数组索引。
答案 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;
}