lin
2025-06-05 ed3dd9d3e7519a82bb871d5eedb24a2fa0c91f47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// Copyright 2017 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.
 
// +build ignore
 
// This program generates bits_tables.go.
 
package main
 
import (
   "bytes"
   "fmt"
   "go/format"
   "io"
   "io/ioutil"
   "log"
)
 
var header = []byte(`// Copyright 2017 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.
 
// Code generated by go run make_tables.go. DO NOT EDIT.
 
package bits
 
`)
 
func main() {
   buf := bytes.NewBuffer(header)
 
   gen(buf, "ntz8tab", ntz8)
   gen(buf, "pop8tab", pop8)
   gen(buf, "rev8tab", rev8)
   gen(buf, "len8tab", len8)
 
   out, err := format.Source(buf.Bytes())
   if err != nil {
       log.Fatal(err)
   }
 
   err = ioutil.WriteFile("bits_tables.go", out, 0666)
   if err != nil {
       log.Fatal(err)
   }
}
 
func gen(w io.Writer, name string, f func(uint8) uint8) {
   fmt.Fprintf(w, "var %s = [256]uint8{", name)
   for i := 0; i < 256; i++ {
       if i%16 == 0 {
           fmt.Fprint(w, "\n\t")
       } else {
           fmt.Fprint(w, " ")
       }
       fmt.Fprintf(w, "%#02x,", f(uint8(i)))
   }
   fmt.Fprint(w, "\n}\n\n")
}
 
func ntz8(x uint8) (n uint8) {
   for x&1 == 0 && n < 8 {
       x >>= 1
       n++
   }
   return
}
 
func pop8(x uint8) (n uint8) {
   for x != 0 {
       x &= x - 1
       n++
   }
   return
}
 
func rev8(x uint8) (r uint8) {
   for i := 8; i > 0; i-- {
       r = r<<1 | x&1
       x >>= 1
   }
   return
}
 
func len8(x uint8) (n uint8) {
   for x != 0 {
       x >>= 1
       n++
   }
   return
}