Полезные __builtin функции



Иногда требуется выполнить какую-то неочевидную битовую операцию, например, проверить число на степень двойки. Кстати, на leadcode / codeforces часто попадаются такие задачки, которые надо решить еще и эффективно. На помощь приходят __builtin функции 😉



__builtin_popcount / __builtin_popcountll:

подсчитывает количество установленных битов в целом числе (32 bit / 64 bit).



__builtin_parity / __builtin_parityll:

проверяет четность числа (32 bit / 64 bit).



__builtin_clz / __builtin_clzll:

подсчитывает количество нулей "слева" у целого числа (little endian, 32 bit / 64 bit).



__builtin_ctz / __builtin_ctzll:

подсчитывает количество нулей "справа" у целого числа (little endian, 32 bit / 64 bit).



__builtin_ffs / __builtin_ffsll:

возвращает индекс + 1 младшего 1-го бита x, или, если x равен нулю, возвращает ноль (32 bit / 64 bit).



__builtin_offsetof:

считает отступ полей от начала в POD (С подобных) структурах.



Живой пример: https://compiler-explorer.com/z/6s5nEE8sb



Конечно, есть еще и другие! Пишите в комментариях👇, какие еще вам пригодились на практике?



#compiler #NONSTANDARD