轮班操作O(1)还是O(n)?
计算机通常需要更多操作来转移31个位置而不是移动1个位置是否有意义?
或者有意义的是,无论我们需要移动多少个位置,移位所需的操作数量都是恒定的?
PS:想知道硬件是否是合适的标签..
请考虑以下代码:
UInt32 val = 1;
UInt32 shift31 = val << 31; // shift31 == 0x80000000
UInt32 shift32 = val << 32; // shift32 == 0x00000001
UInt32 shift33 = val << 33; // shift33 == 0x00000002
UInt32 shift33a = (UInt32)((UInt64)val << 33); // shift33a == 0x00000000
Run Code Online (Sandbox Code Playgroud)
它不会生成警告(关于使用大于32的班次),因此它必须是预期的行为.
实际上被放到生成的程序集中的代码(或者至少是Reflector对代码的解释)是
uint val = 1;
uint shift31 = val << 0x1f;
uint shift32 = val;
uint shift33 = val << 1;
uint shift33a = val << 0x21;
Run Code Online (Sandbox Code Playgroud)
IL(再次,使用Reflector)是
L_0000: nop
L_0001: ldc.i4.1
L_0002: stloc.0 …Run Code Online (Sandbox Code Playgroud) 现在,我知道设置数字的第i位的方法是使用移位运算符移位1直到达到所需位,然后只是或者数字.但是这个过程是O(数字的长度),因为将数字移到第i个位置就像遍历到那里,对吧?如果我错了,请纠正我.
这是我的代码:
x = x| (1<<i)
Run Code Online (Sandbox Code Playgroud)
有没有办法在O(1)中做到这一点?换句话说,如何直接访问数字中的位?我正在考虑数组索引.