bits_test.cc (3087B)
1 // Copyright (c) the JPEG XL Project Authors. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 #include "lib/jxl/base/bits.h" 7 8 #include <cstddef> 9 #include <cstdint> 10 11 #include "lib/jxl/testing.h" 12 13 namespace jxl { 14 namespace { 15 16 TEST(BitsTest, TestNumZeroBits) { 17 // Zero input is well-defined. 18 EXPECT_EQ(32u, Num0BitsAboveMS1Bit(0u)); 19 EXPECT_EQ(64u, Num0BitsAboveMS1Bit(0ull)); 20 EXPECT_EQ(32u, Num0BitsBelowLS1Bit(0u)); 21 EXPECT_EQ(64u, Num0BitsBelowLS1Bit(0ull)); 22 23 EXPECT_EQ(31u, Num0BitsAboveMS1Bit(1u)); 24 EXPECT_EQ(30u, Num0BitsAboveMS1Bit(2u)); 25 EXPECT_EQ(63u, Num0BitsAboveMS1Bit(1ull)); 26 EXPECT_EQ(62u, Num0BitsAboveMS1Bit(2ull)); 27 28 EXPECT_EQ(0u, Num0BitsBelowLS1Bit(1u)); 29 EXPECT_EQ(0u, Num0BitsBelowLS1Bit(1ull)); 30 EXPECT_EQ(1u, Num0BitsBelowLS1Bit(2u)); 31 EXPECT_EQ(1u, Num0BitsBelowLS1Bit(2ull)); 32 33 EXPECT_EQ(0u, Num0BitsAboveMS1Bit(0x80000000u)); 34 EXPECT_EQ(0u, Num0BitsAboveMS1Bit(0x8000000000000000ull)); 35 EXPECT_EQ(31u, Num0BitsBelowLS1Bit(0x80000000u)); 36 EXPECT_EQ(63u, Num0BitsBelowLS1Bit(0x8000000000000000ull)); 37 } 38 39 TEST(BitsTest, TestFloorLog2) { 40 // for input = [1, 7] 41 const size_t expected[7] = {0, 1, 1, 2, 2, 2, 2}; 42 for (uint32_t i = 1; i <= 7; ++i) { 43 EXPECT_EQ(expected[i - 1], FloorLog2Nonzero(i)) << " " << i; 44 EXPECT_EQ(expected[i - 1], FloorLog2Nonzero(static_cast<uint64_t>(i))) 45 << " " << i; 46 } 47 48 EXPECT_EQ(11u, FloorLog2Nonzero(0x00000fffu)); // 4095 49 EXPECT_EQ(12u, FloorLog2Nonzero(0x00001000u)); // 4096 50 EXPECT_EQ(12u, FloorLog2Nonzero(0x00001001u)); // 4097 51 52 EXPECT_EQ(31u, FloorLog2Nonzero(0x80000000u)); 53 EXPECT_EQ(31u, FloorLog2Nonzero(0x80000001u)); 54 EXPECT_EQ(31u, FloorLog2Nonzero(0xFFFFFFFFu)); 55 56 EXPECT_EQ(31u, FloorLog2Nonzero(0x80000000ull)); 57 EXPECT_EQ(31u, FloorLog2Nonzero(0x80000001ull)); 58 EXPECT_EQ(31u, FloorLog2Nonzero(0xFFFFFFFFull)); 59 60 EXPECT_EQ(63u, FloorLog2Nonzero(0x8000000000000000ull)); 61 EXPECT_EQ(63u, FloorLog2Nonzero(0x8000000000000001ull)); 62 EXPECT_EQ(63u, FloorLog2Nonzero(0xFFFFFFFFFFFFFFFFull)); 63 } 64 65 TEST(BitsTest, TestCeilLog2) { 66 // for input = [1, 7] 67 const size_t expected[7] = {0, 1, 2, 2, 3, 3, 3}; 68 for (uint32_t i = 1; i <= 7; ++i) { 69 EXPECT_EQ(expected[i - 1], CeilLog2Nonzero(i)) << " " << i; 70 EXPECT_EQ(expected[i - 1], CeilLog2Nonzero(static_cast<uint64_t>(i))) 71 << " " << i; 72 } 73 74 EXPECT_EQ(12u, CeilLog2Nonzero(0x00000fffu)); // 4095 75 EXPECT_EQ(12u, CeilLog2Nonzero(0x00001000u)); // 4096 76 EXPECT_EQ(13u, CeilLog2Nonzero(0x00001001u)); // 4097 77 78 EXPECT_EQ(31u, CeilLog2Nonzero(0x80000000u)); 79 EXPECT_EQ(32u, CeilLog2Nonzero(0x80000001u)); 80 EXPECT_EQ(32u, CeilLog2Nonzero(0xFFFFFFFFu)); 81 82 EXPECT_EQ(31u, CeilLog2Nonzero(0x80000000ull)); 83 EXPECT_EQ(32u, CeilLog2Nonzero(0x80000001ull)); 84 EXPECT_EQ(32u, CeilLog2Nonzero(0xFFFFFFFFull)); 85 86 EXPECT_EQ(63u, CeilLog2Nonzero(0x8000000000000000ull)); 87 EXPECT_EQ(64u, CeilLog2Nonzero(0x8000000000000001ull)); 88 EXPECT_EQ(64u, CeilLog2Nonzero(0xFFFFFFFFFFFFFFFFull)); 89 } 90 91 } // namespace 92 } // namespace jxl