相关疑难解决方法(0)

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

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

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

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

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

language-agnostic hardware cpu big-o bit-shift

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

将寄存器设置为零的方法有多少?

我很好奇有多少种方法可以在x86汇编中将寄存器设置为零.使用一条指令.有人告诉我,他设法找到了至少10种方法.

我能想到的是:

xor ax,ax
mov ax, 0
and ax, 0
Run Code Online (Sandbox Code Playgroud)

x86 assembly tasm x86-16

28
推荐指数
2
解决办法
3万
查看次数

位移超出允许范围

我们在生产中有一个代码,在某些情况下,它可能会将 32 位无符号整数左移超过 31 位。我知道这被认为是未定义的行为。不幸的是,我们现在无法解决这个问题,但我们可以解决这个问题,前提是我们可以假设它在实践中是如何工作的。

在 x86/amd64 上,我知道用于移位的处理器仅使用移位计数操作数的适当较低有效位。所以这a << b实际上相当于a << (b & 31). 从硬件设计来看,这是完全合理的。

我的问题是:这在现代流行的平台(例如 arm、mips、RISC 等)上如何在实践中工作。我的意思是在现代 PC 和移动设备中实际使用的那些,而不是过时或深奥的。

我们可以假设它们的行为方式相同吗?

编辑:

  1. 我正在谈论的代码目前在区块链中运行。它究竟如何工作并不重要,但至少我们希望确保它在所有机器上产生相同的结果。这是最重要的,否则可以利用它来诱导所谓的链分裂。

  2. 修复这意味着麻烦,因为修复应该同时应用于所有正在运行的机器,否则我们将再次面临链分裂的风险。但我们会在某个时候以有组织(受控)的方式来做这件事。

  3. 各种编译器的问题较小。我们只使用 GCC。我亲眼看了一下代码,里面有shl说明。坦率地说,鉴于上下文,我不希望它有任何不同(移位操作数来自任意来源,无法在编译时预测)。

  4. 请不要提醒我“不能假设”。我知道这个。我的问题是 100% 实用的。正如我所说,我知道在 x86/amd64 上,32 位移位指令仅占用位计数操作数的 5 个最低有效位。

这在当前的现代架构中表现如何?我们还可以将问题限制在 little-endian 处理器上。

c assembly bit-shift cpu-architecture undefined-behavior

3
推荐指数
2
解决办法
128
查看次数

逻辑/算术移位更少的位更快吗?

x>>2不是更快x>>31?换句话说,sar x, 2sar x, 31? 我做了一些简单的测试,它们似乎具有相同的速度。我将不胜感激任何确凿的证据。

c++ performance x86 assembly cpu-architecture

2
推荐指数
1
解决办法
111
查看次数