按位运算仍然可行吗?

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

在大多数较旧的微处理器上,按位运算比加法和减法运算稍快,并且通常比乘法和除法运算快得多。 在现代体系结构中,情况并非如此:按位运算通常与添加速度相同(尽管仍然比乘法更快)。

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

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

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

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

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

当然(对我而言)答案是肯定的。 事实上,现在add指令和a或a一样快and只是意味着…但是or不是add ,你会在需要的时候使用它(当然不是为了总和而是为了执行or ,…)。 添加,分割等指令速度的提高只意味着现在你可以使用它们并且不那么担心性能影响,但现在就像过去一样,你不会将单个add更改为几个按位操作!

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

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

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

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

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

有趣的人认为适合在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是由脑位错误引起的!

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

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