Форум программистов, компьютерный форум CyberForum.ru

Побитовое вычитание - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Xserjik
0 / 0 / 0
Регистрация: 20.09.2013
Сообщений: 2
22.09.2013, 22:06     Побитовое вычитание #1
Здравствуйте. Задача сложить переменные, содержащих 2 машинных слова, используя только логические операции. Получилось такое чудо, однако результат на выходе стабильно в районе -13к.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int _tmain(int argc, _TCHAR* argv[])
{
 short v1=200,v2=150,m;
 int i,e=0;
  for (i=0;i<16;i++)
   {
    int y1,y2;
    y1=(v1&(1<<i))>>i;
    y2=(v2&(1<<i))>>i;
    m |= (y1^y2^e)<<i;
    if ((y1=0)&&(y2!=0))
        e=1;
    else if((y1!=0)&&(y2!=0))
    e=1;
 
        }
        cout<<"Rezultat:"<<m;
 
    system("pause");
Понимаю, что со сдвигами не до конца разобрался. Подскажите.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2013, 22:06     Побитовое вычитание
Посмотрите здесь:

C++ побитовое увеличение
Побитовое представление числа. C++
Побитовое смещение вправо с изюминкой C++
C++ Побитовое чтение
C++ Побитовое исключающее ИЛИ (XOR)
Побитовое сравнение двух чисел C++
C++ Работа с пикселями, побитовое копирование
C++ Побитовое чтение/запись в файл

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
22.09.2013, 23:13     Побитовое вычитание #2
Текст программы почти не читал, но хочу сразу сказать: не стоит забывать, что существует знаковый и беззнаковый сдвиги. Если у вас тип перменной не имеет префикса unsigned, то будет использоваться знаковый сдвиг, который не берет в расчет первый знаковый бит

Добавлено через 21 минуту
Мое пятиминутное решение таково, могут быть и ошибки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
int main()
{
    unsigned int x = 100, y = 100, summ = 0, mask = 1;
    bool rest; // флаг переноса на следующий разряд
 
    for (mask = 1, rest = false; mask != 0; mask <<= 1 )
    {
        summ |= (x & mask) ^ (y & mask);
        if (rest)
            summ ^= mask;
        if ((x & mask) && (y & mask))
            rest = true;
        else
            rest = false;
    }
 
    std::cout << summ << std::endl;
 
    return 0;
}
Yandex
Объявления
22.09.2013, 23:13     Побитовое вычитание
Ответ Создать тему
Опции темы

Текущее время: 17:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru