Я не знаю python, поэтому я просто думаю об этом с точки зрения чистой математической агорифмии ...
Мне приходит в голову, что для первой части более эффективным методом может быть создание маски битов, которые вы хотите сначала переключить, как целое число. Чтобы упростить мне жизнь, я собираюсь предположить, что вы рассчитываете нижнюю и верхнюю границы от младшего значащего бита, равного 0, и самого старшего, равного 31 (или любого другого значения, подходящего для длины целого в вашем случае).
Если вы хотите, чтобы биты от n до m (m> n) были перевернуты, то в двоичном представлении числа 2 ^ (m + 1) -2 ^ n эти биты будут установлены. Затем сделайте XOR, и вы сделаете все обмены за один раз. Компьютер должен быть способен сделать это за один раз, а не по одному на бит.
Что касается подсчета, я не уверен. Есть способы подсчитать количество установленных бит в числе. Я не уверен, что вы получите повышение эффективности, используя вышеуказанную битовую маску с AND, чтобы обнулить все биты, которые вам не нужны для подсчета nad, затем использовать эти алгоритмы, или вам лучше изменить их, чтобы они работали на вас , Я не знаю, как они работают с моей головы. :)