Lar*_*rry 2 c assembly bitmask
我使用了很多按位操作,但我甚至不知道它们是如何在最低级别实现的.
我想看看intel/amd devs如何实现这些操作.不要在我的代码中替换它们,这将是愚蠢的..但是要更广泛地了解正在发生的事情.
我试图找到一些信息,但大多数时候,人们会询问它的使用或用其他按位操作替换它,这不是这里的情况.
它是否在32位的汇编(sse)中进行基本迭代并进行比较?
是否有一些技巧可以加快速度?
谢谢
大多数都直接在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指令.那只是"逻辑"寄存器.由于高级处理器(如英特尔酷睿)会注册重命名,因此您在芯片中拥有的物理寄存器数量超过了逻辑上可用的名称.
AND、OR、XOR 和 NOT 操作在硅片中非常有效地实现,因此在大多数处理器上通常是单周期本机指令。也就是说,对于 16 位处理器,整个 16 位寄存器是一次与运算;在 32 位处理器上,一次 32 位,等等。您可能需要注意的唯一性能问题是对齐:例如,在 ARM 处理器上,如果 32 位值从一个内存地址开始4 的倍数,那么读-修改-写可以在两个或三个周期内完成。如果它位于奇数地址,则必须在相邻的对齐地址上进行两次读取和两次写入,因此速度较慢。
某些较旧处理器中的位移位可能涉及单次位移循环。也就是说,1 << 5
将花费比 更长的时间1 << 2
。但是大多数现代处理器都有所谓的“桶形移位器”,它可以将所有移位均衡到寄存器大小,因此在奔腾上,1 << 31
花费的时间不超过1 << 2
.
加法和减法也是快速原语。乘法和除法很棘手:它们大多作为微代码循环实现。乘法可以通过将循环展开到高端处理器中的大量硅片中来加速,但除法不能,因此除法通常是微处理器中最慢的基本运算。