| // 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) |
| } |