震惊!a / 2 居然比 a >> 1 快!

P1169 [ZJOI2007] 棋盘制作

说得好 我还是选择>>1
by iodwad @ 2017-12-05 10:58:45


我觉得不行
by Hono @ 2017-12-05 11:32:12


刚测了一下,应该是编译器自己优化了,是一样快的
by bzy369258147 @ 2017-12-05 12:36:23


```cpp //test1.cpp int a = 2000; int main() { return a >> 1; } ``` 汇编后是这样 ```asm .file "test.cpp" .globl _a .data .align 4 _a: .long 2000 .def ___main; .scl 2; .type 32; .endef .text .globl _main .def _main; .scl 2; .type 32; .endef _main: LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl $-16, %esp call ___main movl _a, %eax sarl %eax leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc LFE0: .ident "GCC: (GNU) 4.8.1" ``` ```cpp //test2.cpp int a = 2000; int main() { return a / 2; } ``` 汇编后 ```asm .file "test.cpp" .globl _a .data .align 4 _a: .long 2000 .def ___main; .scl 2; .type 32; .endef .text .globl _main .def _main; .scl 2; .type 32; .endef _main: LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl $-16, %esp call ___main movl _a, %eax movl %eax, %edx shrl $31, %edx addl %edx, %eax sarl %eax leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc LFE0: .ident "GCC: (GNU) 4.8.1" ``` 显然$>>$比 $/$快了几条语句。 windows上是这样,但是Linux应该会优化掉,所以应当没区别。我有时间去Linux上试试。
by 星野梦美 @ 2017-12-05 12:47:35


$/2$显然也是用了右移 $sarl$,但是做了些无用功,毕竟除法要保留余数。所以你的问题应该是评测机造成的。
by 星野梦美 @ 2017-12-05 12:51:43


@[虞皓翔](/space/show?uid=10420)
by 星野梦美 @ 2017-12-05 12:59:27


|