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

2018 年 7 月 10 日
 jssyxzy

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

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

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

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

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

Python
3 << 30
# 3221225472L

JavaScript
3 << 30
// -1073741824

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

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

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

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

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

© 2021 V2EX