mirror of https://gitee.com/bigwinds/arangodb
86 lines
2.2 KiB
C++
86 lines
2.2 KiB
C++
////////////////////////////////////////////////////////////////////////////////
|
|
/// DISCLAIMER
|
|
///
|
|
/// Copyright 2016 by EMC Corporation, All Rights Reserved
|
|
///
|
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|
/// you may not use this file except in compliance with the License.
|
|
/// You may obtain a copy of the License at
|
|
///
|
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
///
|
|
/// Unless required by applicable law or agreed to in writing, software
|
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
/// See the License for the specific language governing permissions and
|
|
/// limitations under the License.
|
|
///
|
|
/// Copyright holder is EMC Corporation
|
|
///
|
|
/// @author Andrey Abramov
|
|
/// @author Vasiliy Nabatchikov
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "shared.hpp"
|
|
#include "math_utils.hpp"
|
|
|
|
NS_ROOT
|
|
NS_BEGIN( math )
|
|
|
|
uint32_t log2_64( uint64_t value ) {
|
|
if ( 0 == value ) return 0;
|
|
|
|
static const uint32_t tab64[64] = {
|
|
63, 0, 58, 1, 59, 47, 53, 2,
|
|
60, 39, 48, 27, 54, 33, 42, 3,
|
|
61, 51, 37, 40, 49, 18, 28, 20,
|
|
55, 30, 34, 11, 43, 14, 22, 4,
|
|
62, 57, 46, 52, 38, 26, 32, 41,
|
|
50, 36, 17, 19, 29, 10, 13, 21,
|
|
56, 45, 25, 31, 35, 16, 9, 12,
|
|
44, 24, 15, 8, 23, 7, 6, 5
|
|
};
|
|
|
|
value |= value >> 1;
|
|
value |= value >> 2;
|
|
value |= value >> 4;
|
|
value |= value >> 8;
|
|
value |= value >> 16;
|
|
value |= value >> 32;
|
|
|
|
return tab64[( static_cast< uint64_t >( ( value - ( value >> 1 ) ) * 0x07EDD5E59A4E28C2 ) ) >> 58];
|
|
}
|
|
|
|
uint32_t log2_32( uint32_t value ) {
|
|
static const uint32_t tab32[32] = {
|
|
0, 9, 1, 10, 13, 21, 2, 29,
|
|
11, 14, 16, 18, 22, 25, 3, 30,
|
|
8, 12, 20, 28, 15, 17, 24, 7,
|
|
19, 27, 23, 6, 26, 5, 4, 31
|
|
};
|
|
|
|
value |= value >> 1;
|
|
value |= value >> 2;
|
|
value |= value >> 4;
|
|
value |= value >> 8;
|
|
value |= value >> 16;
|
|
|
|
return tab32[static_cast< uint32_t >( value * 0x07C4ACDD ) >> 27];
|
|
}
|
|
|
|
uint32_t log(uint64_t x, uint64_t base) {
|
|
assert(base > 1);
|
|
|
|
uint32_t res = 0;
|
|
while (x >= base) {
|
|
++res;
|
|
x /= base;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
NS_END // math
|
|
NS_END // root
|
|
|