С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/89: Рейтинг темы: голосов - 89, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 3

Поменять местами заданные биты числа

04.12.2015, 23:04. Показов 17378. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, я студент-начинающий программист с++, помогите справиться с этим заданием, нужно разобраться, что и как откуда вытекает. Желательно с комментариями. Вот собственно задание.
Написать программу, меняющую местами заданные биты числа. Биты в числе нумеруются
справа налево, начиная с нуля. Выполнить программу для значений, явно демонстрирующих
обмен битов (меняются биты со значениями 0 и 1). Биты для обмена 12-14.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.12.2015, 23:04
Ответы с готовыми решениями:

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

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

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

6
34 / 34 / 37
Регистрация: 21.06.2012
Сообщений: 152
05.12.2015, 01:05
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Example program
#include <iostream>
 
void printNumberInBynaryFormat(bool *number, int size)
{
    for(int i(size-1); i>=0; --i)
        std::cout << number[i];
    std::cout<< std::endl;
}
 
void swapBitsInNumberInBynaryFormat(bool *number, int size, int firstSwapPosition, int secondSwapPosition)
{
    if(!((firstSwapPosition >= 0 && firstSwapPosition < size) && (secondSwapPosition >= 0 && secondSwapPosition < size)))
        return;
    bool tmp = number[secondSwapPosition];
    number[secondSwapPosition] = number[firstSwapPosition];
    number[firstSwapPosition] = tmp;
}
 
int main()
{
    unsigned long long int input;
    std::cin >> input;
    bool number[32] = {0};
    for(int i(0); i<32; ++i)
        number[i] = input & (1<<i);
    printNumberInBynaryFormat(number, 32);
    int firstSwapPosition, secondSwapPosition;
    std::cin >> firstSwapPosition >> secondSwapPosition;
    swapBitsInNumberInBynaryFormat(number, 32, firstSwapPosition, secondSwapPosition);
    printNumberInBynaryFormat(number, 32);
    return 0;
}
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
05.12.2015, 03:58
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
 Написать программу, меняющую местами заданные биты числа. Биты в числе нумеруются
справа налево, начиная с нуля. Выполнить программу для значений, явно демонстрирующих
обмен битов (меняются биты со значениями 0 и 1). Биты для обмена 12-14.
*/
#include    <bitset>
#include    <climits>
#include    <iostream>
///////////////////////////////////////////////////////////////////////////////
typedef     unsigned int    T_int_type;
///////////////////////////////////////////////////////////////////////////////
const   int     NUM_BITS_TOTAL  =       sizeof( T_int_type )
                                    *   CHAR_BIT;
///////////////////////////////////////////////////////////////////////////////
template< class  TT_num_type >
TT_num_type     get_swap_num_bits_with_positions
    (
        TT_num_type     num,
        int             pos_L,
        int             pos_R
    )
{
    if( pos_L < pos_R )
    {
        std::swap( pos_L, pos_R );
    }
 
    return          num     
                &   ~( 1    <<  pos_L )
                &   ~( 1    <<  pos_R )
 
            |   ( num   &   1   <<  pos_R )     <<  pos_L - pos_R
            |   ( num   &   1   <<  pos_L )     >>  pos_L - pos_R;
}
///////////////////////////////////////////////////////////////////////////////
template< class  TT_num_type >
void    print_bits( TT_num_type     num )
{
    std::cout   <<  std::bitset< NUM_BITS_TOTAL >   (num).to_string()
                <<  std::endl;
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    for(;;)
    {
        std::cout   <<  typeid( T_int_type ).name()
                    <<  " num"
                    <<  " = ";
 
        T_int_type  num     =   0;
        std::cin    >>  num;
 
        std::cout   <<  "pos 1 (0.."
                    <<  NUM_BITS_TOTAL - 1
                    <<  ")\t= ";
 
        int     pos_1   =   0;
        std::cin    >>  pos_1;
 
        std::cout   <<  "pos 2 (0.."
                    <<  NUM_BITS_TOTAL - 1
                    <<  ")\t= ";
 
        int     pos_2   =   0;
        std::cin    >>  pos_2;
 
        T_int_type  new_num     =   get_swap_num_bits_with_positions
                                        (
                                            num,
                                            pos_1,
                                            pos_2
                                        );
 
        print_bits( num         );
        print_bits( new_num     ); 
        std::cout   <<  std::endl;
    }//for
}
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,989
Записей в блоге: 32
05.12.2015, 04:22
Какой-то адЪ и Израиль...
C++
1
int main() {int a=1<<12, b=1<<14, n; cin>>n; cout<<(n & ~a & ~b | (n&a)<<2 | (n&b)>>2);}
0
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 3
05.12.2015, 16:24  [ТС]
Мне нужно чтобы биты менялись, в каком то нами заданном числе, я попробовал, вот что получилось
C++
1
2
3
4
5
6
int main()
{
int a, b = 0x000AEFFF;
a=(b&~(1<<12))<<2|(b&~(1<<14))>>2|(b&~((1<<12)|(1<<14)));
return 0;
}
0
 Аватар для Геомеханик
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
05.12.2015, 19:07
Как понял так и сделал.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstdio>
typedef unsigned int uint_t;
 
uint_t swap_bits(uint_t n, int i, int j){
    register uint_t a = (n >> i) & 1;
    register uint_t b = (n >> j) & 1;
    if(a != b)
        n = n & ~((1 << i) | (1 << j)) | (a << j) | (b << i);
    return n;
}
 
int main(void){
    uint_t n = 0xEABC;
    printf("0x%X\n", n);
 
    n = swap_bits(n, 4, 12);
    n = swap_bits(n, 5, 13);
    n = swap_bits(n, 6, 14);
    n = swap_bits(n, 7, 15);
    printf("0x%X\n", n);
    return 0;
}
Пример работы кода
0
1 / 1 / 0
Регистрация: 06.03.2021
Сообщений: 6
02.10.2021, 18:42
Чисто теоретически:

1) Сделать маску, в которой не будет битов, с нашими двумя заданными местами.
Например, у нас есть двоичное число 1100, и нужно поменять местами 2 и 3 биты. Делаем маску: 1001
2) Перемножаем побитово эти 2 числа: and (1100, 1001) = 1000
3) Вытаскиваем нужный нам (3й) бит из начального числа, из 1100 -> это 0100
4) Вытаскиваем нужный нам (2й) бит из начального числа, из 1100 -> это 0000[/COLOR]
5.1) Передвигаем 3й бит на 1 вправо, получаем: 0010
5.2) Передвигаем 2й бит на 1 влево, получаем: 0000
6) Побитово складываем эти 2 получившихся числа, с тем, что мы перемножили на маску:
6.1) or(0010, 1000)
6.2) or(0000, 1000)

Получаем ответ: 1010
В принципе всё, выводим ответ.

Написал бы на с++, но сейчас разбираю другой язык. Искал в интернете простую схему - нигде ни нашёл. Вот, делюсь идеей.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.10.2021, 18:42
Помогаю со студенческими работами здесь

Поменять местами биты двух переменных
Ребят, объясните пожалуйста, как поменять местами конкретные биты двух переменных. Сама задача выглядит так: есть 2 переменные типа лонг,...

Поменять местами заданные квадраты матрицы
Привет Всем,помогите пожалуйста с задачкой,либо наведите на путь,остальное постараюсь сам сделать(написать) Дана матрица А(8;8). ...

Поменять в матрице местами заданные столбцы
1)Дано натуральные числа i, j, действительная матрица размера 18х24 (1 ≤ i &lt;j ≤ 24). Поменять в матрице местами i-й и j-й столбцы.

Поменять местами две заданные строки матрицы
С++. Дан двумерный числовой массив. Составить программу обмена местами заданных двух его строк.

Поменять местами заданные в диалоге строки матрицы (многомерного вектора)
Здравствуйте! помогите пожалуйста написать программу (обращение к элементам массива произвести классическим способом и посредством...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru