说得好 我还是选择>>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