С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Naxx
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 4
#1

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

20.12.2013, 08:41. Просмотров 995. Ответов 6
Метки нет (Все метки)

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

Поменять местами значения двух переменных, не используя дополнительной - C++
4.Напишите программу,которая меняет местами значения двух переменных в памяти. В задаче 4 попробуйте найти решение которое не использует...

Поменять местами значения двух переменных, используя один указатель - C++
Это вообще реально? С двумя указателями вот так, с вероятностью ошибки т. к. засылаем на неизвестный адрес. #include <iostream.h> ...

Решение задачи Абрамяна: поменять местами значения двух переменных - C++
Алгоритм и коды программы

Поменять местами значения двух переменных без использования дополнительной переменной - C++
4. Написать программу, которая меняет местами значения двух переменных без использования дополнительной переменной.

Поменять местами биты - C++
Добрый вечер, такой вопрос: имеется массив из 10 чисел, их нужно перевести из десятичного представления в двоичное, найти максимум и если в...

Поменять местами четные и нечетные биты - C++
прошу помощи, код ниже, на выходе получаю 01011010 в чем ошибка? #include<iostream> #include<string> #include<cstring> ...

6
zss
Модератор
Эксперт С++
6582 / 6144 / 2024
Регистрация: 18.12.2011
Сообщений: 16,020
Завершенные тесты: 1
20.12.2013, 08:52 #2
Надо использовать побитовые &(и) |(или).
Чтобы выделить 4-й бит делаем y=(x & 0000000000001000);
Чтобы установить 4-й бит делаем y=(x | 0000000000001000);
1
NikiKoyot
2 / 2 / 0
Регистрация: 08.12.2013
Сообщений: 34
20.12.2013, 12:39 #3
Naxx, Почитай про операции битового(поразрядного уровня). В языке C имеются такие операции:
& - поразрядное И
| - Поразрядное включающее ИЛИ
^ - Поразрядное исключающее ИЛИ
<< - Сдвиг влево
>> - Сдвиг вправо
~ - Одноместное поразрядное дополнение до единицы
1
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;
        }
Вот только мне не нравятся большие числа в цикле, возможно ли привести в более удобный вид?
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 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;
    }
1
Kuzia domovenok
2078 / 1907 / 176
Регистрация: 25.03.2012
Сообщений: 6,572
Записей в блоге: 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;
}
1
Naxx
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 4
12.01.2014, 05:09  [ТС] #7
Всем спасибо за ответы, буду разбираться во всем. Прошу прощения, что запоздал
0
12.01.2014, 05:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2014, 05:09
Привет! Вот еще темы с ответами:

Поменять местами заданные биты числа - C++
Здравствуйте, я студент-начинающий программист с++, помогите справиться с этим заданием, нужно разобраться, что и как откуда вытекает....

Поменять местами 1 и 3 биты с 4 и 6 битами каждого числа. - C++
Нужно срочно написать программу. Помогите! Задание:В массиве Х чисел типа short обработать каждое число согласно условиям:Поменять...

Поменять местами значения целых переменных х и у не используя дополнительных переменных - C++
Знаю, что это очень простая задача, но никак не могу сделать, пожалуйста помогите!!! Поменять местами значения целых переменных х и у не...

Поменять местами значения целых переменных - C++
1.Поменять местами значения целых переменных Х, Y, Z таким образом, чтобы оказалось X\geq Y\geq Z.


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.