@@ -23,7 +23,6 @@ namespace hud::os::common
2323 * This indicates that a zero byte (0x00) is present in the word at byte index 2 and 4
2424 */
2525 [[nodiscard]] static constexpr u64 has_zero_byte (u64 value) noexcept
26-
2726 {
2827 // From http://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord
2928 // value= 0x1213140015001617
@@ -53,6 +52,75 @@ namespace hud::os::common
5352 // Final result after has_zero_byte = 0x8000000000008000
5453 return has_zero_byte (value ^ (0x0101010101010101ULL * byte_value));
5554 }
55+
56+ /* * Returns the number of consecutive 0 bits in the value. */
57+ [[nodiscard]] static constexpr u32 leading_zero (u8 value) noexcept
58+ {
59+ if (value == 0 )
60+ return 8 ;
61+
62+ #if defined(HD_COMPILER_CLANG) || defined(HD_COMPILER_CLANG_CL) || defined(HD_COMPILER_GCC)
63+ return u8 (__builtin_clz ((u32 (value) << 1 ) | 1 ) - 23 );
64+ #else
65+ return 7 - floor_log2 (u32 (value));
66+ #endif
67+ }
68+
69+ /* * Returns the number of consecutive 0 bits in the value. */
70+ [[nodiscard]] static constexpr u32 leading_zero (u32 value) noexcept
71+ {
72+ if (value == 0 )
73+ return 32 ;
74+ return 31 - hud::math::floor_log2 (u32 (value));
75+ }
76+
77+ /* * Returns the number of consecutive 0 bits in the value. */
78+ [[nodiscard]] static constexpr u32 leading_zero (u64 value) noexcept
79+ {
80+ if (value == 0 )
81+ return 64 ;
82+ return 63 - hud::math::floor_log2 (value);
83+ }
84+
85+ [[nodiscard]] static constexpr u32 trailing_zero (u32 value) noexcept
86+ {
87+ u32 c = 32 ; // c will be the number of zero bits on the right
88+ value &= -i32 (value);
89+ if (value)
90+ c--;
91+ if (value & 0x0000FFFFu )
92+ c -= 16 ;
93+ if (value & 0x00FF00FFu )
94+ c -= 8 ;
95+ if (value & 0x0F0F0F0Fu )
96+ c -= 4 ;
97+ if (value & 0x33333333u )
98+ c -= 2 ;
99+ if (value & 0x55555555u )
100+ c -= 1 ;
101+ return c;
102+ }
103+
104+ [[nodiscard]] static constexpr u64 trailing_zero (u64 value) noexcept
105+ {
106+ u64 c = 64 ; // c sera le nombre de bits zéro à droite
107+ value &= -i64 (value); // Mask les bits de poids faible avec l'opération de complément à 2
108+ if (value)
109+ c--;
110+ if (value & 0x00000000FFFFFFFFu )
111+ c -= 32 ;
112+ if (value & 0x0000FFFF0000FFFFu )
113+ c -= 16 ;
114+ if (value & 0x00FF00FF00FF00FFu )
115+ c -= 8 ;
116+ if (value & 0x0F0F0F0F0F0F0F0Fu )
117+ c -= 4 ;
118+ if (value & 0x3333333333333333u )
119+ c -= 2 ;
120+ if (value & 0x5555555555555555u )
121+ c -= 1 ;
122+ return c;
123+ }
56124 };
57125
58126} // namespace hud::os::common
0 commit comments