3 回答

TA貢獻1868條經(jīng)驗 獲得超4個贊
首先,請注意,這是問題中出現(xiàn)的表達式的更好版本。表達式是一個,所以有效的移位值在 0 到 30 或 62 之間,這取決于 int 的大小。 允許在 0 和 63 之間。uint64(1) << (n-1)uint64(1 << uint(n-1))1<<nintuint64(1) << nn
通常,您建議的優(yōu)化不正確。編譯器必須能夠推斷出該值是否在特定范圍內(nèi)。n
請參閱此示例(在操場上)
package main
import (
"fmt"
"math"
)
func main() {
n := 65
fmt.Println(uint64(math.Pow(2, float64(n-1))))
fmt.Println(uint64(1) << uint(n-1))
}
輸出表明這兩種方法是不同的:
9223372036854775808
0

TA貢獻1860條經(jīng)驗 獲得超8個贊
數(shù)學。Pow()
用于對數(shù)字進行操作。位移位以計算 2 的冪只能應用于整數(shù),并且只能應用于結(jié)果適合(或 )的微小子集。float64
int64
uint64
如果您有這樣的特殊情況,我們非常歡迎您使用位移位。
結(jié)果大于或基數(shù)不是(或 的冪)的任何其他情況都需要浮點運算。math.MaxInt64
2
2
另請注意,即使將實現(xiàn)對上述可能的微小子集的檢測,結(jié)果也是2的補碼格式,該格式也必須轉(zhuǎn)換為IEEE 754格式,因為返回值為is(盡管這些數(shù)字可以被緩存),您很可能會再次將其轉(zhuǎn)換回。math.Pow()
float64
int64
同樣:如果需要性能,請使用顯式位移位。

TA貢獻1784條經(jīng)驗 獲得超9個贊
因為這種優(yōu)化從未實施過。
go編譯器旨在實現(xiàn)快速的編譯時間。因此,一些優(yōu)化被認為是不值得的。這節(jié)省了編譯時間,但代價是需要一些運行時。
- 3 回答
- 0 關(guān)注
- 107 瀏覽
添加回答
舉報