github.com/balzaczyy/golucene@v0.0.0-20151210033525-d0be9ee89713/core/util/bit.go (about)

     1  package util
     2  
     3  // util/BitUtil.java
     4  
     5  var BYTE_COUNTS = []int{ // table of bits/byte
     6  	0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
     7  	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
     8  	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
     9  	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    10  	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    11  	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    12  	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    13  	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    14  	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    15  	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    16  	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    17  	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    18  	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    19  	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    20  	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    21  	4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
    22  }
    23  
    24  // The General Idea: instead of having an array per byte that has
    25  // the offsets of the next set bit, that array could be
    26  // packed inside a 32 bit integer (8 4 bit numbers).  That
    27  // should be faster than accessing an array for each index, and
    28  // the total array size is kept smaller (256*sizeof(int))=1K
    29  /***** the python code that generated bitlist
    30    def bits2int(val):
    31    arr=0
    32    for shift in range(8,0,-1):
    33      if val & 0x80:
    34        arr = (arr << 4) | shift
    35      val = val << 1
    36    return arr
    37  
    38    def int_table():
    39      tbl = [ hex(bits2int(val)).strip('L') for val in range(256) ]
    40      return ','.join(tbl)
    41    ******/
    42  var BIT_LISTS = []int{
    43  	0x0, 0x1, 0x2, 0x21, 0x3, 0x31, 0x32, 0x321, 0x4, 0x41, 0x42, 0x421, 0x43,
    44  	0x431, 0x432, 0x4321, 0x5, 0x51, 0x52, 0x521, 0x53, 0x531, 0x532, 0x5321,
    45  	0x54, 0x541, 0x542, 0x5421, 0x543, 0x5431, 0x5432, 0x54321, 0x6, 0x61, 0x62,
    46  	0x621, 0x63, 0x631, 0x632, 0x6321, 0x64, 0x641, 0x642, 0x6421, 0x643,
    47  	0x6431, 0x6432, 0x64321, 0x65, 0x651, 0x652, 0x6521, 0x653, 0x6531, 0x6532,
    48  	0x65321, 0x654, 0x6541, 0x6542, 0x65421, 0x6543, 0x65431, 0x65432, 0x654321,
    49  	0x7, 0x71, 0x72, 0x721, 0x73, 0x731, 0x732, 0x7321, 0x74, 0x741, 0x742,
    50  	0x7421, 0x743, 0x7431, 0x7432, 0x74321, 0x75, 0x751, 0x752, 0x7521, 0x753,
    51  	0x7531, 0x7532, 0x75321, 0x754, 0x7541, 0x7542, 0x75421, 0x7543, 0x75431,
    52  	0x75432, 0x754321, 0x76, 0x761, 0x762, 0x7621, 0x763, 0x7631, 0x7632,
    53  	0x76321, 0x764, 0x7641, 0x7642, 0x76421, 0x7643, 0x76431, 0x76432, 0x764321,
    54  	0x765, 0x7651, 0x7652, 0x76521, 0x7653, 0x76531, 0x76532, 0x765321, 0x7654,
    55  	0x76541, 0x76542, 0x765421, 0x76543, 0x765431, 0x765432, 0x7654321, 0x8,
    56  	0x81, 0x82, 0x821, 0x83, 0x831, 0x832, 0x8321, 0x84, 0x841, 0x842, 0x8421,
    57  	0x843, 0x8431, 0x8432, 0x84321, 0x85, 0x851, 0x852, 0x8521, 0x853, 0x8531,
    58  	0x8532, 0x85321, 0x854, 0x8541, 0x8542, 0x85421, 0x8543, 0x85431, 0x85432,
    59  	0x854321, 0x86, 0x861, 0x862, 0x8621, 0x863, 0x8631, 0x8632, 0x86321, 0x864,
    60  	0x8641, 0x8642, 0x86421, 0x8643, 0x86431, 0x86432, 0x864321, 0x865, 0x8651,
    61  	0x8652, 0x86521, 0x8653, 0x86531, 0x86532, 0x865321, 0x8654, 0x86541,
    62  	0x86542, 0x865421, 0x86543, 0x865431, 0x865432, 0x8654321, 0x87, 0x871,
    63  	0x872, 0x8721, 0x873, 0x8731, 0x8732, 0x87321, 0x874, 0x8741, 0x8742,
    64  	0x87421, 0x8743, 0x87431, 0x87432, 0x874321, 0x875, 0x8751, 0x8752, 0x87521,
    65  	0x8753, 0x87531, 0x87532, 0x875321, 0x8754, 0x87541, 0x87542, 0x875421,
    66  	0x87543, 0x875431, 0x875432, 0x8754321, 0x876, 0x8761, 0x8762, 0x87621,
    67  	0x8763, 0x87631, 0x87632, 0x876321, 0x8764, 0x87641, 0x87642, 0x876421,
    68  	0x87643, 0x876431, 0x876432, 0x8764321, 0x8765, 0x87651, 0x87652, 0x876521,
    69  	0x87653, 0x876531, 0x876532, 0x8765321, 0x87654, 0x876541, 0x876542,
    70  	0x8765421, 0x876543, 0x8765431, 0x8765432, 0x87654321,
    71  }
    72  
    73  /* Return the number of bits sets in b. */
    74  func BitCount(b byte) int {
    75  	return BYTE_COUNTS[b&0xFF]
    76  }
    77  
    78  /* Returns the number of set bits in a slice of int64. */
    79  func pop_array(arr []int64) int {
    80  	popCount := 0
    81  	for _, v := range arr {
    82  		uv := uint64(v)
    83  		for uv > 0 {
    84  			popCount += BitCount(byte(uv & 0xff))
    85  			uv >>= 8
    86  		}
    87  	}
    88  	return popCount
    89  }
    90  
    91  func ZigZagEncodeLong(l int64) int64 {
    92  	return (l >> 63) ^ (l << 1)
    93  }
    94  
    95  func ZigZagDecodeLong(l int64) int64 {
    96  	return int64(uint64(l)>>1) ^ -(l & 1)
    97  }