Побитовые целочисленные операции

Эти функции позволяют работать с целыми числами как с битовыми структурами, представляющими дополнительные значения в двоичной системе исчисления, где у позиции бита N вес 2**N. Биты нумеруются от нуля и выше. При этих операциях бит знака целого числа отнесен на неопределенную позицию слева. Таким образом, над каждым старшим битом у положительного целого числа будет находиться 0 бит, а у отрицательного - 1 бит.

Табл. 1. Побитовые целочисленные операции CLEM
Функция Результат Описание
~~ INT1 Целое Создает побитовое дополнение целого числа INT1. То есть, в результате 1 находится на каждой битовой позиции, в которой у числа INT1 был 0. Всегда верно равенство ~~ INT = –(INT + 1).
INT1 || INT2 Целое Результат этой операции - побитовое "ИЛИ включительное" для двух целых чисел, INT1 и INT2. То есть, в результате будет 1 на каждой битовой позиции, для которой 1 есть или в числе INT1, или в INT2, или в обоих числах.
INT1 ||/& INT2 Целое Результат этой операции - побитовое "ИЛИ исключительное" для двух целых чисел, INT1 и INT2. То есть, в результате будет 1 на каждой битовой позиции, для которой 1 есть или в числе INT1, или в INT2, но не в обоих числах одновременно.
INT1 && INT2 Целое Результат - это побитовое "И" целых чисел INT1 и INT2. То есть, в результате будет 1 на каждой битовой позиции, для которой 1 есть и в числе INT1, и в INT2.
INT1 &&~~ INT2 Целое Результат - это побитовое "И" числа INT1 и побитового дополнения числа INT2. То есть, в результате будет 1 на каждой битовой позиции, для которой в числе INT1 есть 1, а в числе INT2 - 0. Это то же самое, что и INT1 && (~~INT2), и может быть полезно для очистки битов набора INT1 в INT2.
INT << N Целое Создает битовую структуру числа INT1, сдвинутую влево на N позиций. При отрицательном значении N возникает сдвиг вправо.
INT >> N Целое Создает битовую структуру числа INT1, сдвинутую вправо на N позиций. При отрицательном значении N возникает сдвиг влево.
INT1 &&=_0 INT2 Логический Эквивалентно логическому выражению INT1 && INT2 /== 0, но более эффективно.
INT1 &&/=_0 INT2 Логический Эквивалентно логическому выражению INT1 && INT2 == 0, но более эффективно.
integer_bitcount(INT) Целое Считает количество битов 1 или 0 в представлении двоичного дополнения числа INT. Если INT не отрицательное, N - это количество бит 1. Если INT отрицательное, это количество бит 0. Из-за знакового расширения существует бесконечное число бит 0 в неотрицательном числе или бит 1 в отрицательном числе. Всегда выполнено равенство integer_bitcount(INT) = integer_bitcount(-(INT+1)).
integer_leastbit(INT) Целое Возвращает положение N младшего бита, заданного для целого числа INT. N - эта наибольшая степень двойки, на которую нацело делится INT.
integer_length(INT) Целое Возвращает длину в битах числа INT как целого в представлении двоичного дополнения. То есть, N - это наименьшее целое, такое что INT < (1 << N) если INT >= 0 INT >= (–1 << N) если INT < 0. Если INT неотрицательное, для представления INT как целого числа без знака требуется по меньшей мере N бит. Как вариант, для представления INT как целого со знаком требуется как минимум N+1 бит независимо от его знака.
testbit(INT, N) Логический Проверяет бит в положении N для целого числа INT и возвращает состояние бита N как логическое значение, равное true для 1 и false для 0.