Битовые операции Битовые операции с примерами
Над целыми числами также можно производить битовые операции
int.bit_length() - количество бит, необходимых для представления числа в двоичном виде, без учёта знака и лидирующих нулей.
>>>
>>> n = -37>>> bin(n)'-0b100101' >>> n.bit_length()6
int.to_bytes(length, byteorder, *, signed=False) - возвращает строку байтов, представляющих это число.
>>>
>>> (1024).to_bytes(2, byteorder='big')b'\x04\x00' >>> (1024).to_bytes(10, byteorder='big')b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' >>> (-1024).to_bytes(10, byteorder='big', signed=True)b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00' >>> x = 1000>>> x.to_bytes((x.bit_length() // 8) + 1, byteorder='little')b'\xe8\x03'
classmethod int.from_bytes(bytes, byteorder, *, signed=False) - возвращает число из данной строки байтов.
>>>
>>> int.from_bytes(b'\x00\x10', byteorder='big')16 >>> int.from_bytes(b'\x00\x10', byteorder='little')4096 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)-1024 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)64512 >>> int.from_bytes([255, 0, 0], byteorder='big')16711680
Те, у кого в школе была информатика, знают, что числа могут быть представлены не только в десятичной системе счисления. К примеру, в компьютере используется двоичный код, и, к примеру, число 19 в двоичной системе счисления будет выглядеть как 10011. Также иногда нужно переводить числа из одной системы счисления в другую. Python для этого предоставляет несколько функций:
int([object], [основание системы счисления]) - преобразование к целому числу в десятичной системе счисления. По умолчанию система счисления десятичная, но можно задать любое основание от 2 до 36 включительно.
bin(x) - преобразование целого числа в двоичную строку.
hex(х) - преобразование целого числа в шестнадцатеричную строку.
oct(х) - преобразование целого числа в восьмеричную строку.
Примеры:
>>>
>>> a = int('19') # Переводим строку в число>>> b = int('19.5') # Строка не является целым числомTraceback (most recent call last): File "", line 1, in ValueError: invalid literal for int() with base 10: '19.5'>>> c = int(19.5) # Применённая к числу с плавающей точкой, отсекает дробную часть>>> print(a, c)19 19 >>> bin(19)'0b10011' >>> oct(19)'0o23' >>> hex(19)'0x13' >>> 0b10011 # Так тоже можно записывать числовые константы19 >>> int('10011', 2)19 >>> int('0b10011', 2)19
float.as_integer_ratio() - пара целых чисел, чьё отношение равно этому числу.
float.is_integer() - является ли значение целым числом.
float.hex() - переводит float в hex (шестнадцатеричную систему счисления).
classmethod float.fromhex(s) - float из шестнадцатеричной строки.
>>>
>>> (10.5).hex()'0x1.5000000000000p+3' >>> float.fromhex('0x1.5000000000000p+3')10.5
Даны целые числа a и k. Выведите число, которое получается из а установкой значения k-го бита в 1.
Входные данные
В одной строке заданы два числа a и k (0 ≤ a ≤ 109). Самый младший бит числа a считать нулевым битом.
Выходные данные
Выведите число a с установленным k-ым битом.
элементарная задача – битовые операции
Известно, что степень двойки можно вычислить сдвигом влево: 2n = 1 << n. Искомым результатом будет значение a OR (1 << k).
k,n=map(int,input().split()) print(k|(2**n))
Даны целые числа а и k. Выведите число, которое получается из а инвертированием k-го бита.
Входные данные
В одной строке заданы два числа a и k (0 ≤ a ≤ 109).
Выходные данные
Выве
элементарная задача – битовые операции
Известно, что степень двойки можно вычислить сдвигом влево: 2k = 1 << k. Искомым результатом будет значение a XOR (1 << k).
k,n=map(int,input().split())
print(k^(2**n))
Даны целые числа а и k. Выведите значение k-го бита числа а, равное 0 или 1.
Вход. В одной строке заданы два числа a и k (0 ≤ a ≤ 109).
Выход. Выведите значение k-ого бита числа а.
179 0
1
элементарная задача – битовые операции
Выражение a & (1 << k) равно 0, если k-ый бит числа а равен 0. Если приведенное выражение равно степени двойки, то бит равен 1. В зависимости от этого выводим ответ.
k,n=map(int,input().split())
m=k&(2**n)
if m==2**n:
print(1)
else:
print(0)
Даны целые числа a и k. Выведите число, которое получается из a сбросом значения k-го бита в 0. Младший бит имеет номер 0.
Вход. Два числа a и k (0 ≤ a ≤ 109).
Выход. Выведите число a с обнулённым k-ым битом.
14 1
12
элементарная задача – битовые операции
Значение 1 << k содержит единицу в k-ом бите, а во всех остальных битах нули. Тогда отрицание этого выражения, то есть ~(1 << k) содержит ноль в k-ом бите, а во всех остальных битах единицы. Осталось найти побитовый and значения a и ~(1 << k).
k,n=map(int,input().split())
print(k& ~(2**n))
Выведите число 2n, используя только битовые операции.
Входные данные
Одно число n (0 ≤ n ≤ 30).
Выходные данные
Выведите число 2n, используя только битовые операции.
Лимит времени 1 секунда
Лимит использования памяти 128 MiB
Входные данные #2
1
Входные данные #1
0
Выходные данные #1
1
элементарная задача – битовые операции
Значение 2k при заданных ограничениях помещается в целочисленный 32-битовый знаковый тип int. Известно, что степень двойки можно вычислить сдвигом влево: 2k = 1 << k.
Выходные данные #2
2
k=int(input())
print(1<<k)
Даны два различных числа k и n. Выведите значение 2k + 2n, используя только битовые операции.
Вход. Два различных числа k и n (0 ≤ k, n ≤ 30).
Выход. Выведите число 2k + 2n.
0 1
3
элементарная задача – битовые операции
Значение 2k + 2n при заданных ограничениях помещается в целочисленный 32-битовый знаковый тип int. Известно, что степень двойки можно вычислить сдвигом влево: 2n = 1 << n. Используя сдвиг влево, вычисляем сумму 2k + 2n как (1 << k) + (1 << n).
Читаем входные данные. Вычисляем и выводим ответ.
k,n=map(int,input().split())
print((1<<k)+(1<<n))