Sobes.tech
Junior

İşaretli bit işlemleri kullanarak tam sayıyı 2 ile çarpmak veya bölmek nasıl yapılır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Для умножения на 2 используется битовый сдвиг влево (<<).
Для деления на 2 используется битовый сдвиг вправо (>>).

int num = 10;
int multiplied_by_2 = num << 1; // num * 2 = 20
int divided_by_2 = num >> 1;   // num / 2 = 5 (для положительных чисел)

При делении отрицательного числа на 2 с использованием битового сдвига вправо (>>) результат будет зависеть от типа сдвига:

  • Логический (unsigned): В освобождающиеся биты слева будут записываться нули.
  • Арифметический (signed): В освобождающиеся биты слева будет записываться значение знакового бита (для сохранения знака).

В C/C++ для знаковых типов используется арифметический сдвиг. Это может привести к неожиданным результатам для нечетных отрицательных чисел:

int negative_num = -7;
int divided_by_2_signed = negative_num >> 1; // -4 (а не -3)

Для корректного деления отрицательных чисел на 2 с округлением в сторону нуля при использовании битового сдвига, можно использовать следующий прием:

int negative_num = -7;
int divided_by_2_corrected = (negative_num >= 0) ? (negative_num >> 1) : ((negative_num + 1) >> 1); // -3