按位运算仍然可行吗?

时间:2011-07-02 21:17:19

标签: c bit-manipulation bitwise-operators

维基百科,一个真正的知识来源,指出:

  

在大多数旧式微处理器上,按位   操作比稍快   加法和减法运算   并且通常明显快于   乘法和除法   操作。在现代建筑上,   事实并非如此:按位   操作通常是一样的   速度加法(虽然仍然更快   而不是乘法)。

是否有一个实际的理由来学习按位操作黑客,或者现在只是你从理论和好奇心中学到的东西?

9 个答案:

答案 0 :(得分:13)

按位操作值得研究,因为它们有许多应用程序。替换算术运算的主要用途是。密码学,计算机图形学,散列函数,压缩算法和网络协议只是一些按位运算非常有用的例子。

您从维基百科文章中引用的行只是试图提供一些关于按位操作的速度的线索。不幸的是,该文章未能提供一些很好的应用示例。

答案 1 :(得分:11)

按位运算仍然有用。例如,它们可用于使用单个变量创建“标志”,并节省用于指示各种条件的变量数。关于算术运算的性能,最好让编译器进行优化(除非你是某种大师)。

答案 2 :(得分:4)

它们有助于理解二进制“如何工作”;否则,没有。事实上,我会说,即使在给定的架构上,按位攻击速度更快,编译器的工作就是利用这个事实 - 而不是你的。写下你的意思。

答案 3 :(得分:1)

当然(对我而言)答案是肯定的。现在,add指令与orand一样快,这意味着......但or不是add且无论如何你都会在需要的时候使用它(当然不是为了总结or,而是......)。添加,分割等指令速度的提高只意味着现在您可以使用它们而不用担心性能影响,但现在就像过去一样,您不会更改单个{{1}几个按位操作!

答案 4 :(得分:1)

使用它们的唯一情况是,如果你实际上使用你的数字作为比特向量。例如,如果您正在为某种硬件建模,而变量代表寄存器。

如果要执行算术运算,请使用算术运算符。

答案 5 :(得分:1)

取决于您的问题。如果您正在控制硬件,则需要在整数范围内设置单个位。

购买OGD1 PCI板(开放式图形卡)并使用libpci与它通信。 http://en.wikipedia.org/wiki/Open_Graphics_Project

答案 6 :(得分:1)

在大多数情况下,当您将整数乘以恰好为2的幂的常量时,编译器会优化它以使用位移。但是,当shift也是一个变量时,编译器不能扣除它,除非你明确使用了shift操作。

答案 7 :(得分:1)

有趣的人认为在C / C ++中提及ctype []数组是合适的 - 也是用Java实现的。这个概念在语言处理中非常有用,特别是在使用不同的字母表或解析句子时。

ctype []是256个短整数的数组,在每个整数中,有代表不同字符类型的位。例如,ctype [; A'] - ctype ['Z']的位设置为显示它们是字母表的大写字母; ctype ['0'] - ctype ['9']的位设置为显示它们是数字。要查看字符x是否为字母数字,您可以编写类似'if(ctype [x]&(UC | LC | NUM))'的内容,它比写'if('A'= x)更快更优雅< ='Z'|| ....'。

一旦你开始按位思考,就会发现很多地方可以使用它。例如,我有两个文本缓冲区。我写了一个到另一个,在我去的时候用REPLACEstring替换所有出现的FINDstring。然后对于下一个查找 - 替换对,我只是切换缓冲区索引,所以我总是从缓冲区[in]写入缓冲区[out]。 'in'开始为0,'out'为1.完成复制后我只写了'in ^ = 1; out ^ = 1;'。在处理完所有替换后,我只是将缓冲区[out]写入磁盘,而不需要知道当时的“out”。

如果您认为这是低级别的,请考虑某些精神错误,例如deja-vu及其双jamais-vu是由脑位误差引起的!

答案 8 :(得分:0)

使用IPv4地址经常需要位操作来发现对等方的地址是否在可路由网络内,或者必须转发到网关,或者对等方是防火墙规则允许或拒绝的网络的一部分。需要比特操作来发现网络的广播地址。

使用IPv6地址需要相同的基本位级操作,但由于它们太长,我不确定它们是如何实现的。我打赌他们仍然使用数据的上的位操作符来实现它们,这些操作符适合于体系结构。