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

Поменять местами биты двух переменных - C++

Восстановить пароль Регистрация
 
Naxx
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 4
20.12.2013, 08:41     Поменять местами биты двух переменных #1
Ребят, объясните пожалуйста, как поменять местами конкретные биты двух переменных. Сама задача выглядит так: есть 2 переменные типа лонг, нужно поменять в них местами значения битов, кратных четырем (как я понял, 1100 1001 0001 1111 - те, которые выделены красным). Решать задачу за меня не нужно, интересно было бы сделать её самому, расскажите как работают нужные мне операторы и какие собственно мне нужны Ищу в гугле уже 4й час, никак не пойму в какую сторону мне копать Находил здесь на форуме решение подобной задачи, но без пояснений ничего не понял. Буду признателен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2013, 08:41     Поменять местами биты двух переменных
Посмотрите здесь:

Значения переменных а, Ь и с поменять местами так, чтобы оказалось а >= Ь >= с. C++
Поменять местами 1 и 3 биты с 4 и 6 битами каждого числа. C++
Значения переменных X, Y, Z поменять местами так C++
Введенные значения переменных a, b, c поменять местами так, чтобы оказалось a>=b>=c C++
Поменять местами значения целых переменных A и B C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,185
Завершенные тесты: 1
20.12.2013, 08:52     Поменять местами биты двух переменных #2
Надо использовать побитовые &(и) |(или).
Чтобы выделить 4-й бит делаем y=(x & 0000000000001000);
Чтобы установить 4-й бит делаем y=(x | 0000000000001000);
NikiKoyot
 Аватар для NikiKoyot
2 / 2 / 0
Регистрация: 08.12.2013
Сообщений: 34
20.12.2013, 12:39     Поменять местами биты двух переменных #3
Naxx, Почитай про операции битового(поразрядного уровня). В языке C имеются такие операции:
& - поразрядное И
| - Поразрядное включающее ИЛИ
^ - Поразрядное исключающее ИЛИ
<< - Сдвиг влево
>> - Сдвиг вправо
~ - Одноместное поразрядное дополнение до единицы
Naxx
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 4
26.12.2013, 05:38  [ТС]     Поменять местами биты двух переменных #4
Пока дошел до этого, вроде правильно. Есть соображения как улучшить?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    long a(0), b(0);
    cin >> a >> b;
    //перестановка 4го бита
    if ((a&8) != (b&8))
        if (a & 8)
        {
            a ^= 8;
            b |= 8;
        }
        else
        {
            a |= 8;
            b ^= 8;
        }
        cout << "a = " << a << "\nb = " << b;
Добавлено через 28 минут
Полное решение задачи получилось таким:
C++
1
2
3
4
5
6
7
8
9
10
11
12
for (int i(8); i <= 32768; i *= 16)
    if ((a&i) != (b&i))
        if (a & i)
        {
            a ^= i;
            b |= i;
        }
        else
        {
            a |= i;
            b ^= i;
        }
Вот только мне не нравятся большие числа в цикле, возможно ли привести в более удобный вид?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
26.12.2013, 08:35     Поменять местами биты двух переменных #5
C++
1
2
3
4
5
6
7
8
    long a = 123;
    long b = 456;
    for ( int i = 3; i < sizeof( long ) * 8; i += 4 ) {
        long a_bit = a & (1 << i);
        long b_bit = b & (1 << i);
        a = a & ~a_bit | b_bit;
        b = b & ~b_bit | a_bit;
    }
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
26.12.2013, 14:14     Поменять местами биты двух переменных #6
циклы - жалкая трата процессорного времени. Битовые операции рулят!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <ctime>
int main() {
    srand(time(0));
    unsigned long a=rand()*rand();
    unsigned long b=rand()*rand();
    unsigned long diff=(a^b)&0x88888888;
    cout<<"before: "<<hex<<a<<" "<<b<<endl;
    b^=diff;
    a^=diff;
    cout<<"after: "<<hex<<a<<" "<<b<<endl;
    cin.get();
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2014, 05:09     Поменять местами биты двух переменных
Еще ссылки по теме:

Поменять местами значения двух переменных без использования дополнительной переменной C++
C++ Поменять местами значения двух переменных, не используя дополнительной
C++ Поменять местами значения целых переменных

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

Или воспользуйтесь поиском по форуму:
Naxx
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 4
12.01.2014, 05:09  [ТС]     Поменять местами биты двух переменных #7
Всем спасибо за ответы, буду разбираться во всем. Прошу прощения, что запоздал
Yandex
Объявления
12.01.2014, 05:09     Поменять местами биты двух переменных
Ответ Создать тему
Опции темы

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