github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/math/bits/bits.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:generate go run make_tables.go 6 7 // bitsパッケージは、事前に宣言された符号なし整数型のためのビットカウントと操作 8 // 関数を実装します。 9 // 10 // このパッケージの関数は、パフォーマンス向上のためにコンパイラによって直接実装される可能性があります。 11 // そのような関数の場合、このパッケージのコードは使用されません。 12 // どの関数がコンパイラによって実装されるかは、アーキテクチャとGoのリリースによります。 13 package bits 14 15 // UintSizeは、uintのビット単位のサイズです。 16 const UintSize = uintSize 17 18 // LeadingZerosは、xの先頭のゼロビットの数を返します。x == 0の場合、結果は [UintSize] です。 19 func LeadingZeros(x uint) int 20 21 // LeadingZeros8は、xの先頭のゼロビットの数を返します。x == 0の場合、結果は8です。 22 func LeadingZeros8(x uint8) int 23 24 // LeadingZeros16は、xの先頭のゼロビットの数を返します。x == 0の場合、結果は16です。 25 func LeadingZeros16(x uint16) int 26 27 // LeadingZeros32は、xの先頭のゼロビットの数を返します。x == 0の場合、結果は32です。 28 func LeadingZeros32(x uint32) int 29 30 // LeadingZeros64は、xの先頭のゼロビットの数を返します。x == 0の場合、結果は64です。 31 func LeadingZeros64(x uint64) int 32 33 // TrailingZerosは、xの末尾のゼロビットの数を返します。x == 0の場合、結果は [UintSize] です。 34 func TrailingZeros(x uint) int 35 36 // TrailingZeros8は、xの末尾のゼロビットの数を返します。x == 0の場合、結果は8です。 37 func TrailingZeros8(x uint8) int 38 39 // TrailingZeros16は、xの末尾のゼロビットの数を返します。x == 0の場合、結果は16です。 40 func TrailingZeros16(x uint16) int 41 42 // TrailingZeros32は、xの末尾のゼロビットの数を返します。x == 0の場合、結果は32です。 43 func TrailingZeros32(x uint32) int 44 45 // TrailingZeros64は、xの末尾のゼロビットの数を返します。x == 0の場合、結果は64です。 46 func TrailingZeros64(x uint64) int 47 48 // OnesCountは、xの1ビットの数("ポピュレーションカウント")を返します。 49 func OnesCount(x uint) int 50 51 // OnesCount8は、xの1ビットの数("ポピュレーションカウント")を返します。 52 func OnesCount8(x uint8) int 53 54 // OnesCount16は、xの1ビットの数("ポピュレーションカウント")を返します。 55 func OnesCount16(x uint16) int 56 57 // OnesCount32は、xの1ビットの数("ポピュレーションカウント")を返します。 58 func OnesCount32(x uint32) int 59 60 // OnesCount64は、xの1ビットの数("ポピュレーションカウント")を返します。 61 func OnesCount64(x uint64) int 62 63 // RotateLeftは、xを左に(k mod [UintSize])ビット回転させた値を返します。 64 // xをkビット右に回転させるには、RotateLeft(x, -k)を呼び出します。 65 // 66 // この関数の実行時間は入力に依存しません。 67 func RotateLeft(x uint, k int) uint 68 69 // RotateLeft8は、xを左に(k mod 8)ビット回転させた値を返します。 70 // xをkビット右に回転させるには、RotateLeft8(x, -k)を呼び出します。 71 // 72 // この関数の実行時間は入力に依存しません。 73 func RotateLeft8(x uint8, k int) uint8 74 75 // RotateLeft16は、xを左に(k mod 16)ビット回転させた値を返します。 76 // xをkビット右に回転させるには、RotateLeft16(x, -k)を呼び出します。 77 // 78 // この関数の実行時間は入力に依存しません。 79 func RotateLeft16(x uint16, k int) uint16 80 81 // RotateLeft32は、xを左に(k mod 32)ビット回転させた値を返します。 82 // xをkビット右に回転させるには、RotateLeft32(x, -k)を呼び出します。 83 // 84 // この関数の実行時間は入力に依存しません。 85 func RotateLeft32(x uint32, k int) uint32 86 87 // RotateLeft64は、xを左に(k mod 64)ビット回転させた値を返します。 88 // xをkビット右に回転させるには、RotateLeft64(x, -k)を呼び出します。 89 // 90 // この関数の実行時間は入力に依存しません。 91 func RotateLeft64(x uint64, k int) uint64 92 93 // Reverseは、ビットが逆順になったxの値を返します。 94 func Reverse(x uint) uint 95 96 // Reverse8は、ビットが逆順になったxの値を返します。 97 func Reverse8(x uint8) uint8 98 99 // Reverse16は、ビットが逆順になったxの値を返します。 100 func Reverse16(x uint16) uint16 101 102 // Reverse32は、ビットが逆順になったxの値を返します。 103 func Reverse32(x uint32) uint32 104 105 // Reverse64は、ビットが逆順になったxの値を返します。 106 func Reverse64(x uint64) uint64 107 108 // ReverseBytesは、バイトが逆順になったxの値を返します。 109 // 110 // この関数の実行時間は入力に依存しません。 111 func ReverseBytes(x uint) uint 112 113 // ReverseBytes16は、バイトが逆順になったxの値を返します。 114 // 115 // この関数の実行時間は入力に依存しません。 116 func ReverseBytes16(x uint16) uint16 117 118 // ReverseBytes32は、バイトが逆順になったxの値を返します。 119 // 120 // この関数の実行時間は入力に依存しません。 121 func ReverseBytes32(x uint32) uint32 122 123 // ReverseBytes64は、バイトが逆順になったxの値を返します。 124 // 125 // この関数の実行時間は入力に依存しません。 126 func ReverseBytes64(x uint64) uint64 127 128 // Lenは、xを表現するために必要なビットの最小数を返します。x == 0の場合、結果は0です。 129 func Len(x uint) int 130 131 // Len8は、xを表現するために必要なビットの最小数を返します。x == 0の場合、結果は0です。 132 func Len8(x uint8) int 133 134 // Len16は、xを表現するために必要なビットの最小数を返します。x == 0の場合、結果は0です。 135 func Len16(x uint16) (n int) 136 137 // Len32は、xを表現するために必要なビットの最小数を返します。x == 0の場合、結果は0です。 138 func Len32(x uint32) (n int) 139 140 // Len64は、xを表現するために必要なビットの最小数を返します。x == 0の場合、結果は0です。 141 func Len64(x uint64) (n int) 142 143 // Addは、x、y、およびcarryの和を返します:sum = x + y + carry。 144 // carry入力は0または1でなければなりません。それ以外の場合、動作は未定義です。 145 // carryOut出力は0または1であることが保証されています。 146 // 147 // この関数の実行時間は入力に依存しません。 148 func Add(x, y, carry uint) (sum, carryOut uint) 149 150 // Add32は、x、y、およびcarryの和を返します:sum = x + y + carry。 151 // carry入力は0または1でなければなりません。それ以外の場合、動作は未定義です。 152 // carryOut出力は0または1であることが保証されています。 153 // 154 // この関数の実行時間は入力に依存しません。 155 func Add32(x, y, carry uint32) (sum, carryOut uint32) 156 157 // Add64は、x、y、およびcarryの和を返します:sum = x + y + carry。 158 // carry入力は0または1でなければなりません。それ以外の場合、動作は未定義です。 159 // carryOut出力は0または1であることが保証されています。 160 // 161 // この関数の実行時間は入力に依存しません。 162 func Add64(x, y, carry uint64) (sum, carryOut uint64) 163 164 // Subは、x、y、およびborrowの差を返します:diff = x - y - borrow。 165 // borrow入力は0または1でなければなりません。それ以外の場合、動作は未定義です。 166 // borrowOut出力は0または1であることが保証されています。 167 // 168 // この関数の実行時間は入力に依存しません。 169 func Sub(x, y, borrow uint) (diff, borrowOut uint) 170 171 // Sub32は、x、y、およびborrowの差を返します:diff = x - y - borrow。 172 // borrow入力は0または1でなければなりません。それ以外の場合、動作は未定義です。 173 // borrowOut出力は0または1であることが保証されています。 174 // 175 // この関数の実行時間は入力に依存しません。 176 func Sub32(x, y, borrow uint32) (diff, borrowOut uint32) 177 178 // Sub64は、x、y、およびborrowの差を返します:diff = x - y - borrow。 179 // borrow入力は0または1でなければなりません。それ以外の場合、動作は未定義です。 180 // borrowOut出力は0または1であることが保証されています。 181 // 182 // この関数の実行時間は入力に依存しません。 183 func Sub64(x, y, borrow uint64) (diff, borrowOut uint64) 184 185 // Mulは、xとyの全幅の積を返します:(hi, lo) = x * y 186 // 積のビットの上半分はhiに、下半分はloに返されます。 187 // 188 // この関数の実行時間は入力に依存しません。 189 func Mul(x, y uint) (hi, lo uint) 190 191 // Mul32は、xとyの64ビットの積を返します:(hi, lo) = x * y 192 // 積のビットの上半分はhiに、下半分はloに返されます。 193 // 194 // この関数の実行時間は入力に依存しません。 195 func Mul32(x, y uint32) (hi, lo uint32) 196 197 // Mul64は、xとyの128ビットの積を返します:(hi, lo) = x * y 198 // 積のビットの上半分はhiに、下半分はloに返されます。 199 // 200 // この関数の実行時間は入力に依存しません。 201 func Mul64(x, y uint64) (hi, lo uint64) 202 203 // Divは、(hi, lo)をyで割った商と余りを返します: 204 // quo = (hi, lo)/y, rem = (hi, lo)%y 205 // 被除数のビットの上半分はパラメータhiに、下半分はパラメータloにあります。 206 // y == 0の場合(ゼロ除算)またはy <= hiの場合(商のオーバーフロー)、Divはパニックします。 207 func Div(hi, lo, y uint) (quo, rem uint) 208 209 // Div32は、(hi, lo)をyで割った商と余りを返します: 210 // quo = (hi, lo)/y, rem = (hi, lo)%y 211 // 被除数のビットの上半分はパラメータhiに、下半分はパラメータloにあります。 212 // y == 0の場合(ゼロ除算)またはy <= hiの場合(商のオーバーフロー)、Div32はパニックします。 213 func Div32(hi, lo, y uint32) (quo, rem uint32) 214 215 // Div64は、(hi, lo)をyで割った商と余りを返します: 216 // quo = (hi, lo)/y, rem = (hi, lo)%y 217 // 被除数のビットの上半分はパラメータhiに、下半分はパラメータloにあります。 218 // y == 0の場合(ゼロ除算)またはy <= hiの場合(商のオーバーフロー)、Div64はパニックします。 219 func Div64(hi, lo, y uint64) (quo, rem uint64) 220 221 // Remは、(hi, lo)をyで割った余りを返します。Remは 222 // y == 0の場合(ゼロ除算)にパニックしますが、Divとは異なり、 223 // 商のオーバーフローではパニックしません。 224 func Rem(hi, lo, y uint) uint 225 226 // Rem32は、(hi, lo)をyで割った余りを返します。Rem32は 227 // y == 0の場合(ゼロ除算)にパニックしますが、[Div32] とは異なり、 228 // 商のオーバーフローではパニックしません。 229 func Rem32(hi, lo, y uint32) uint32 230 231 // Rem64は、(hi, lo)をyで割った余りを返します。Rem64は 232 // y == 0の場合(ゼロ除算)にパニックしますが、[Div64] とは異なり、 233 // 商のオーバーフローではパニックしません。 234 func Rem64(hi, lo, y uint64) uint64