Как увеличить значение unsigned int на 1, используя только сдвиг битов и логический opr?
У меня есть вопрос в моем назначении / проекте, который добавляет 1 к целому без знака только с использованием битовых сдвигов и логических операторов. В функции не должно быть символов "+", "-", "*" или "/".
Я пытаюсь с последних дней, но пока безуспешно. До сих пор я пробовал следующее:
int A = (((B&C)<<1)^(B^C))
Кто-нибудь может помочь мне решить это.?
Вы можете помочь мне на любом языке программирования.
5 ответов
unsigned int i = ...;
unsigned int mask = 1;
while (i & mask)
{
i &= ~mask;
mask <<= 1;
}
i |= mask;
Джава:
public static int inc(int i){
if ((i & 1) == 0)
return i | 1;
else
return inc(i>>1)<<1;
}
PS пока вариант петли Henrik явно быстрее
Попробуй это:
int n = 3;
n = abs(~n);
std::cout << n;
~n = -(n+1)
[ ~
для поразрядного дополнения]. (n + 1)
происходит из-за добавления 1 к 2 преобразованию дополнения.
Получить (x + 1)
примените отрицание еще раз. Итак, окончательное выражение становится(-(~x))
.
Логика для обозначения числа без использования арифметических операторов (+, -. * and /
)
unsinged int no = 3; //actual number
unsigned int one = 1;
unsigned int ans = 0;
unsigned int carry = 0;
unsigned int prev_ans = 0;
unsigned int prev_carry = 0;
ans = no ^ one;
carry = no & one;
while (carry != 0)
{
carry <<= 1;
prev_ans = ans;
prev_carry = carry;
ans = prev_ans ^ prev_carry;
carry = prev_ans & prev_carry;
}
Это слишком просто, например, в Haskell:
data Unsigned = Zero | Succ Unsigned
increment :: Unsigned -> Unsigned
increment u = Succ u
Никаких побитовых или арифметических операторов, никаких операторов вообще!