inline fn ffsXi2(comptime T: type, a: T) i32
inline fn ffsXi2(comptime T: type, a: T) i32 { var x: @Int(.unsigned, @typeInfo(T).int.bits) = @bitCast(a); var n: T = 1; // adapted from Number of trailing zeroes (see ctzXi2) var mask: @TypeOf(x) = std.math.maxInt(@TypeOf(x)); comptime var shift = @bitSizeOf(T); // In contrast to ctz return 0 if (x == 0) return 0; inline while (shift > 1) { shift = shift >> 1; mask = mask >> shift; if ((x & mask) == 0) { n = n + shift; x = x >> shift; } } // return ctz + 1 return @as(i32, @intCast(n - @as(T, @bitCast((x & 1))))) + 1; }