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