...
Run Format

Source file src/math/bits/make_tables.go

Documentation: math/bits

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

View as plain text