// 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" "log" "os" ) 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 = os.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 }