github.com/gidoBOSSftw5731/go/src@v0.0.0-20210226122457-d24b0edbf019/math/bits/make_tables.go (about) 1 // Copyright 2017 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build ignore 6 // +build ignore 7 8 // This program generates bits_tables.go. 9 10 package main 11 12 import ( 13 "bytes" 14 "fmt" 15 "go/format" 16 "io" 17 "log" 18 "os" 19 ) 20 21 var header = []byte(`// Copyright 2017 The Go Authors. All rights reserved. 22 // Use of this source code is governed by a BSD-style 23 // license that can be found in the LICENSE file. 24 25 // Code generated by go run make_tables.go. DO NOT EDIT. 26 27 package bits 28 29 `) 30 31 func main() { 32 buf := bytes.NewBuffer(header) 33 34 gen(buf, "ntz8tab", ntz8) 35 gen(buf, "pop8tab", pop8) 36 gen(buf, "rev8tab", rev8) 37 gen(buf, "len8tab", len8) 38 39 out, err := format.Source(buf.Bytes()) 40 if err != nil { 41 log.Fatal(err) 42 } 43 44 err = os.WriteFile("bits_tables.go", out, 0666) 45 if err != nil { 46 log.Fatal(err) 47 } 48 } 49 50 func gen(w io.Writer, name string, f func(uint8) uint8) { 51 fmt.Fprintf(w, "var %s = [256]uint8{", name) 52 for i := 0; i < 256; i++ { 53 if i%16 == 0 { 54 fmt.Fprint(w, "\n\t") 55 } else { 56 fmt.Fprint(w, " ") 57 } 58 fmt.Fprintf(w, "%#02x,", f(uint8(i))) 59 } 60 fmt.Fprint(w, "\n}\n\n") 61 } 62 63 func ntz8(x uint8) (n uint8) { 64 for x&1 == 0 && n < 8 { 65 x >>= 1 66 n++ 67 } 68 return 69 } 70 71 func pop8(x uint8) (n uint8) { 72 for x != 0 { 73 x &= x - 1 74 n++ 75 } 76 return 77 } 78 79 func rev8(x uint8) (r uint8) { 80 for i := 8; i > 0; i-- { 81 r = r<<1 | x&1 82 x >>= 1 83 } 84 return 85 } 86 87 func len8(x uint8) (n uint8) { 88 for x != 0 { 89 x >>= 1 90 n++ 91 } 92 return 93 }