😺
Go言語で整数の絶対値を返す関数を作る
Go言語のintは64bit環境か32bit環境でサイズが変わります。なんで、intの絶対値を計算する関数を作るのは少し考える必要があるのですが、今回分かったので共有します。
main.go
package main
import "fmt"
const intSize = 32 << (^uint(0) >> 63)
func abs(v int) int {
y := v >> (intSize - 1)
return (v ^ y) - y
}
func main() {
fmt.Println(abs(-23))
fmt.Println(abs(+45))
}
このintSize
というのはgoの標準ライブラリのfmt/scan.go
で定義されているintBits
と同じです。32bit環境だとシフトなしで、64bit環境だと1回シフトするので、intSize
はそれぞれ32と64になるわけです。
実行はlinuxで次のように実行して確認しました。
$ GOARCH=386 go run .
23
45
$ GOARCH=amd64 go run .
23
45
Discussion