相关疑难解决方法(0)

位移O(1)还是O(n)?

轮班操作O(1)还是O(n)

计算机通常需要更多操作来转移31个位置而不是移动1个位置是否有意义?

或者有意义的是,无论我们需要移动多少个位置,移位所需的操作数量都是恒定的?

PS:想知道硬件是否是合适的标签..

language-agnostic hardware cpu big-o bit-shift

30
推荐指数
4
解决办法
1万
查看次数

为什么在移位32位值时仅使用移位操作数的低5位?(例如(UInt32)1 << 33 == 2)

请考虑以下代码:

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)

c# bit-shift

14
推荐指数
1
解决办法
1995
查看次数

C:在O(1)中将整数的第i位设置为1

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

这是我的代码:

x = x| (1<<i)
Run Code Online (Sandbox Code Playgroud)

有没有办法在O(1)中做到这一点?换句话说,如何直接访问数字中的位?我正在考虑数组索引.

c bit-manipulation bit bitwise-operators time-complexity

0
推荐指数
1
解决办法
142
查看次数