背景
由于 c\++的语法中没有规定右移的实现方式,使用算数右移和逻辑右移由编译器决定。
在我们经常使用的编译器(GNU c\++ 和 Visual Studio c\++)中均使用算数右移来处理右移。故在竞赛中大多数默认是算数右移。
算数右移的右移1位和除以2的不同。
算数右移1位 等于除以2向下取整。
“整数/2”在C++中实现为“除以2并向零取整”。
这在正整数中看起来还正常,答案也都一致。
如:
3>>1 = 1
3/2 = 1
但在负整数就不同了,因为向下取整导致数变得更小。
如:
(-3)>>1 = -2
-3/2 = -1
算数右移和逻辑右移的区别
算数右移后,高位用符号位填充。
逻辑右移后,高位用0填充。
低位越界后均舍弃。
这些细节还是要注意,要有耐心的、仔细的搞清楚,这样碰到才不会着急。