| // run | |
| // Copyright 2018 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package main | |
| import "fmt" | |
| func main() { | |
| want := int32(0x3edae8) | |
| got := foo(1) | |
| if want != got { | |
| panic(fmt.Sprintf("want %x, got %x", want, got)) | |
| } | |
| } | |
| func foo(a int32) int32 { | |
| return shr1(int32(shr2(int64(0x14ff6e2207db5d1f), int(a))), 4) | |
| } | |
| func shr1(n int32, m int) int32 { return n >> uint(m) } | |
| func shr2(n int64, m int) int64 { | |
| if m < 0 { | |
| m = -m | |
| } | |
| if m >= 64 { | |
| return n | |
| } | |
| return n >> uint(m) | |
| } |