注册 登录
编程论坛 C语言论坛

关于移位

fulltimelink 发布于 2020-07-01 14:52, 3543 次点击
一个计算交集的函数中使用移位记录元素是否存在
程序代码:

...
m[k] |= 1<<0
...
m[k] |= 1<<1

为啥不直接写成下面这种 (“直觉上不是效率更高吗?”)

m[k] |= 1
m[k] |= 2


是因为平台的兼容性么?(搜索了下,大小端好像不影响移位)
还是因为方便阅读?

12 回复
#2
ditg2020-07-01 15:20
虽然啥都不太一样,不过在键盘驱动程序里见过直接用1和2的
#3
fulltimelink2020-07-01 15:27
如果是不定数组的个数, 使用1<<i 这类的我能理解, 就是没看懂这咱固定个数的情况下,这么 写的目的~
#4
吹水佬2020-07-01 15:44
以下是引用fulltimelink在2020-7-1 14:52:25的发言:
(“直觉上不是效率更高吗?”)

编译效率可能有所不同
运行效率应该没什么差别,有兴趣可以看看编译后的代码。
#5
fulltimelink2020-07-01 15:51
回复 4楼 吹水佬
是的,编译器有优化,简单看了下,汇编指令是一样的
只有本站会员才能查看附件,请 登录
#6
八画小子2020-07-01 15:52
以下是引用吹水佬在2020-7-1 15:44:08的发言:


编译效率可能有所不同
运行效率应该没什么差别,有兴趣可以看看编译后的代码。

如果是看编译效率的话,个人觉得,1<<1 效率其实是低于直接写2的,因为前者需要在编译时进行计算,而后者是字面值常量,后者是直接拿来用的。
不过如果单看这2条,运行效率确实应该是一样的,因为在编译后生成的二进制指令所对应的汇编语言中都是用同一个立即数的。

没有看到具体的代码,觉得编码者可能是为了阅读方便吧,因为1<<1所能看出的内容要比2多一点,可以看出位移的位置,而2毕竟还是要思考以下。这种差别数值大的时候很明显。

[此贴子已经被作者于2020-7-1 15:55编辑过]

#7
ditg2020-07-01 17:56
回复 5楼 fulltimelink
叉劈了,这也不是数组啊,呵呵

还有,这编译器有点意外,奇地址?

[此贴子已经被作者于2020-7-1 17:57编辑过]

#8
fulltimelink2020-07-01 20:14
回复 7楼 ditg
我只是简单测试了一下移位和直接赋值的编译结果……  数组说的是数组的个数
#9
fulltimelink2020-07-01 21:00
回复 6楼 八画小子
整体代码只是两个数组元素求交集的一个函数,并没其他复杂的内容,按你说的,应该就是方便阅读
#10
lin51616782020-07-02 10:08
1和2 你能直接写
1<<22 还能直接写吗?
写出来猜得出是什么意思?

至于效率
坦白说 现在语法都没学利索的程度 没必要考虑效率
#11
fulltimelink2020-07-02 10:44
回复 10楼 lin5161678
好吧, 算我没说清楚,   两个数组元素求交集的函数 ,都不会用到1<<2 。。。,1<<0 只是标识第一个元素的元素,1<<1只是标识第二个数组元素而已。 我也说了如果是多个数组求交集使用1<<i 我能理解 。。。
#12
八画小子2020-07-02 13:10
以下是引用fulltimelink在2020-7-2 10:44:29的发言:

好吧, 算我没说清楚,   两个数组元素求交集的函数 ,都不会用到1<<2 。。。,1<<0 只是标识第一个元素的元素,1<<1只是标识第二个数组元素而已。 我也说了如果是多个数组求交集使用1<<i 我能理解 。。。


其实,你写代码的时候能够思考很多额外的问题,说明你比我们这些懒惰的人都要利害哈。其实进步就是这么积累出来的,即便某些问题是错的或是思考的答案是错的。
#13
fulltimelink2020-07-02 15:26
回复 12楼 八画小子
1