编程中用移位运算替代乘除法会不会有问题?

2018-07-10 14:40:33 +08:00
 jssyxzy

因为移位运算实际上有算术移位,逻辑移位,循环移位;
又有有符号数,无符号数;
不同编程语言有可能实现不同。

请问这里面有没有什么坑?

10229 次点击
所在节点    程序员
80 条回复
reus
2018-07-10 15:12:44 +08:00
不懂就不要用
cheesea
2018-07-10 15:22:39 +08:00
会挨揍,除非确实有必要。
shore507
2018-07-10 15:26:27 +08:00
没必要最好不用,强行装逼会挨揍的
luozic
2018-07-10 15:28:40 +08:00
业务代码最好不要使用, 框架单元测试写得多,可以在框架里面用,优化性能。
8023
2018-07-10 15:29:59 +08:00
在性能相对较差的单片机上,这样写二进制下的整乘整除,可以加快运行速度。但在电脑上这么写就没任何用处了。
pathletboy
2018-07-10 15:35:59 +08:00
大部分现代编译器会尽可能把 2 的 n 次方的乘除法优化为左移右移。
hjlmjx
2018-07-10 15:39:32 +08:00
移植性差是一方面吧?
x86vk
2018-07-10 15:41:03 +08:00
cpp 的话,没必要这么做,一般编译器都会做优化,具体可以参考一下 microcai 的某篇博文。

用左移右移代替乘除法的话一般是不会出问题的,只有在遇到浮点型的数据的时候才会出现问题。
yanaraika
2018-07-10 15:41:11 +08:00
在 编译器质量差的编译器上才这么做,如果你的编译器是近 5 年内发布的,那么没有这么做的必要
jssyxzy
2018-07-10 17:07:03 +08:00
我觉得楼上诸位太那个了,我问的不是工程问题,是科学问题好么?
我只想搞清楚这个。
rabbbit
2018-07-10 17:12:38 +08:00

例如 Javascript,位运算只支持 32 位
超出边界时会有意向不到的效果

Python
3 << 30
# 3221225472L

JavaScript
3 << 30
// -1073741824

除了 leetcode 想不到还有哪里需要位运算了
ermao
2018-07-10 17:21:57 +08:00
@rabbbit 哈哈哈面向 Leetcode 编程
mengzhuo
2018-07-10 17:33:08 +08:00
hacker's delight 了解一下
stevenbipt
2018-07-10 17:44:12 +08:00
感觉 11 楼说得没毛病😄😄😄😄😄
pynix
2018-07-10 19:00:01 +08:00
强行装逼最致命。。。
redsonic
2018-07-10 19:21:16 +08:00
我只想说 linux 内核里面各种位移,随便用乘除要被喷死。至于动态语言里面就变装逼,可能就是解释器的问题了,或是平台转换时候的各种坑。
smdbh
2018-07-10 20:24:31 +08:00
你每次乘除都是 2 幂么?
meteor957
2018-07-10 20:30:10 +08:00
内马尔为什么总被踢……
jssyxzy
2018-07-10 21:31:56 +08:00
我真是不懂怎么这么多人纠结这个?
位移本来就比乘除法快,虽然这个东西对于大多数硬件来说微不足道;
但是不要学没有见过世面好么?
这个确实很多方面要用到,比如编译器优化,汇编代码,单片机等。
jssyxzy
2018-07-10 21:33:20 +08:00
好吧,这个问题应该是我找错地方问了,应该多在 V2EX 多问问工程类问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/469591

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX