按位 - 如何实现位掩码操作?

Lar*_*rry 2 c assembly bitmask

上下文

我使用了很多按位操作,但我甚至不知道它们是如何在最低级别实现的.

我想看看intel/amd devs如何实现这些操作.不要在我的代码中替换它们,这将是愚蠢的..但是要更广泛地了解正在发生的事情.

我试图找到一些信息,但大多数时候,人们会询问它的使用或用其他按位操作替换它,这不是这里的情况.

问题

它是否在32位的汇编(sse)中进行基本迭代并进行比较?

是否有一些技巧可以加快速度?

谢谢

cod*_*eim 9

大多数都直接在CPU上实现,作为基本的本机指令,而不是SSE的一部分.这些是CPU寄存器中最古老,最基本的操作.

至于如何and,or,xor,等来实现,如果你真的有兴趣,抬头数字逻辑设计,或离散数学.查找触发器,与门或NAND/NOR/XOR门

https://en.wikipedia.org/wiki/NAND_logic

还可以查找K-maps(卡诺图),这些可以用来手动实现逻辑电路.

https://en.wikipedia.org/wiki/Karnaugh_map

如果您真的喜欢阅读,如果您有权访问工程或计算机科学大学,您可以注册数字逻辑设计课程.您将在面包板上构建具有大型IC的逻辑电路,但是现在大多数CPU都使用代码(如软件)"编写"并在硅晶片上"打印".

特别感兴趣的是NAND并且NOR由于它们的功能完整性(您可以使用NAND或NOR来构造任何真值表).

NAND(逻辑符号看起来像= Do-)

A
  =Do- Q    is Q = NOT(A AND B)
B

Truth table
A    B     Q
0    0     1
0    1     1
1    0     1
1    1     0
Run Code Online (Sandbox Code Playgroud)

您可以使用NAND重写任何逻辑.

正如您所看到的,它非常高效,您不能获得比具有二进制的单个门更低的级别(尽管存在三态/三态逻辑),因此其单个时钟状态发生变化.因此,对于64位CPU寄存器,您需要并排64个这样的婴儿,PER寄存器... PER核心... PER指令.那只是"逻辑"寄存器.由于高级处理器(如英特尔酷睿)会注册重命名,因此您在芯片中拥有的物理寄存器数量超过了逻辑上可用的名称.


Lee*_*ker 5

AND、OR、XOR 和 NOT 操作在硅片中非常有效地实现,因此在大多数处理器上通常是单周期本机指令。也就是说,对于 16 位处理器,整个 16 位寄存器是一次与运算;在 32 位处理器上,一次 32 位,等等。您可能需要注意的唯一性能问题是对齐:例如,在 ARM 处理器上,如果 32 位值从一个内存地址开始4 的倍数,那么读-修改-写可以在两个或三个周期内完成。如果它位于奇数地址,则必须在相邻的对齐地址上进行两次读取和两次写入,因此速度较慢。

某些较旧处理器中的位移位可能涉及单次位移循环。也就是说,1 << 5将花费比 更长的时间1 << 2。但是大多数现代处理器都有所谓的“桶形移位器”,它可以将所有移位均衡到寄存器大小,因此在奔腾上,1 << 31花费的时间不超过1 << 2.

加法和减法也是快速原语。乘法和除法很棘手:它们大多作为微代码循环实现。乘法可以通过将循环展开到高端处理器中的大量硅片中来加速,但除法不能,因此除法通常是微处理器中最慢的基本运算。