Как увеличить значение 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;
}

Google для полного Adder и попробуйте реализовать один.

Это слишком просто, например, в Haskell:

data Unsigned = Zero | Succ Unsigned
increment :: Unsigned -> Unsigned
increment u = Succ u

Никаких побитовых или арифметических операторов, никаких операторов вообще!

Другие вопросы по тегам