С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 2
Регистрация: 22.12.2014
Сообщений: 62
1

Инвертировать биты с парными номерами

18.03.2017, 20:03. Показов 2248. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Если содержание принятого кода может быть представлено в виде 2 в степени n, то выполнить операцию инвертирования значимых бит с парными номерами. В противном случае выполнить циклический сдвиг принятого кода влево на 2 бита.
Не получается инвертировать биты с парными номерами, подскажите что не так в коде. И есть ли способ сделать инвертирование с помощью битовых операций, а не массивов?
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
80
81
82
83
84
85
86
87
88
89
90
#include <string> 
#include <stdio.h> 
#include <iostream> 
#include <cstdlib> 
#include <sstream> 
#include <bitset> 
using namespace std; 
 
 
const int size = 8; 
 
int main() 
{ 
 
setlocale(LC_ALL, "Russian"); 
while (true) 
{ 
int a=0; 
int mas[size]; 
cout<<"\nВведите число по битам: "<<endl; 
int result=0; 
for (int i = 0; i < size; i++) 
{ 
cin>>mas[i]; 
if (mas[i]==1) 
{ 
result++; 
} 
} 
bool flag=false; 
 
if (result==1) 
{ 
flag=true; 
} 
 
for (int i = 0; i < size; i++) 
{ 
cout<<mas[i]; 
} 
 
if (flag==true) // если флаг поднят
{ 
 
cout<<endl; 
cout<<"\nПреобразованно: "<<endl; 
for (int i = 0; i < size; i++) 
{ 
if (mas[i]==mas[i+1]) 
{ 
if (mas[i]==1) 
{ 
mas[i]^=0; 
} 
else 
{ 
mas[i]^=1; 
} 
 
} 
cout<<mas[i]; 
} 
cout<<endl; 
 
} 
else{ 
//иначе 
cout<<"\nПреобразованно:  "; 
ostringstream ost; 
string s_num; 
for (int i = 0; i <8; i++) 
{ 
 
 
ost << mas[i]; 
s_num = ost.str(); 
 
} 
 
cout<<bitset<8>(bitset<8>(s_num).to_ulong()<<2).to_string(); 
//двигаем биты
 
} 
 
 
 
} 
 
system("pause"); 
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.03.2017, 20:03
Ответы с готовыми решениями:

Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат
нужна помощь в битовых операциях.Ввести целое число A. Инвертировать все биты с 4 по 8, включая...

Инвертировать биты числа
установить в числе 347 биты если они не установлены,а если установлены снять

Инвертировать биты определенного целого значения
Подскажите как инвертировать с третьего по одиннадцатый включительно биты в двоичном представлении...

Инвертировать все биты в старшем байте числа.
Инвертировать все биты в старшем байте числа.

12
nmcf
18.03.2017, 20:09
  #2

Не по теме:

С чётными номерами. :rtfm: Грамотно излагай.

0
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
18.03.2017, 20:28 3
Так чтоли?
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
#include <iostream>
#include <cstdlib>
#include <Windows.h>
 
 
 
int main(){
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
 
 
 
    int arr_1[8] = {0,1,1,0,0,1,1,0};
    int arr_2[8] = {1,1,0,0,1,0,1,1};
 
    
    for (int i(0); i!=7; i++){
        std::cout << arr_1[i];
    } std::cout << std::endl;
 
    for (int i(0); i!=7; i++){
        std::cout << arr_2[i];
    } std::cout << std::endl;
 
 
    for (int i(0); i!=8; i++){
        if(arr_1[i] == arr_2[i] && arr_1[i] == 0 && arr_2[i] == 0)
        arr_2[i] = 1;
        if(arr_1[i] == arr_2[i] && arr_1[i] == 1 && arr_2[i] == 1)
        arr_2[i] = 0;
    }
 
    std::cout << "inversion" << std::endl;
    for (int i(0); i!=7; i++){
        std::cout << arr_2[i];
    } std::cout << std::endl;
 
    system ("pause");
    return 0;
};
0
0 / 0 / 2
Регистрация: 22.12.2014
Сообщений: 62
18.03.2017, 22:08  [ТС] 4
Нет, там второй массив не нужен.
Нужно инвертировать четные биты в коде. т.е второй бит, четвертый, шестой и восьмой
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.03.2017, 22:18 5
Если считать от начала массива:
C++
1
2
3
if (flag)
    for (int i = 1; i < size; i += 2)
        mas[i] = ~mas[i];
1
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
18.03.2017, 22:19 6
Это еще проще.
Вы можете использовать условие
C++
1
2
3
4
if (arr[i] == 0)
arr[i] = 1;
else
arr[i] = 0;
А можете тернарным условием.
C++
1
arr[i] == 0 ? arr[i] = 1 : arr[i] == 0;
1
0 / 0 / 2
Регистрация: 22.12.2014
Сообщений: 62
18.03.2017, 23:53  [ТС] 7
работает, только оно меняет единицу на -2, а должно менять на 0

Добавлено через 5 минут
И еще должны инвертироваться только те, которые идут после единицы. т.е если код 00010000, то должно быть 00000101
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
19.03.2017, 00:54 8
Цитата Сообщение от vizinar Посмотреть сообщение
И есть ли способ сделать инвертирование с помощью битовых операций, а не массивов?
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
#include <iostream>
#include <cassert>
 
typedef uint8_t byte;
 
int invertEvenSignificantBits(byte x)
{
    for (byte mask = 1; mask < x && mask != 0; mask <<= 2)
        x ^= mask;
 
    return x;
}
 
byte rotateLeft(byte x, byte n)
{
    return (x << n) | (x >> (8-n));
}
 
int main()
{
    int x;
    std::cin >> x;
    assert(0 <= x && x < 256);
 
    bool isPowerOfTwo = (x != 0) && ( (x&(x-1)) == 0 );
    x = isPowerOfTwo ? invertEvenSignificantBits(x) : rotateLeft(x, 2);
 
    std::cout << x << "\n";
}
1
0 / 0 / 2
Регистрация: 22.12.2014
Сообщений: 62
19.03.2017, 08:32  [ТС] 9
Как я понял этот способ работает с десятичными числами, а у меня данные вводятся уже в двоичной форме (01001010)
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
19.03.2017, 09:19 10
Лучший ответ Сообщение было отмечено vizinar как решение

Решение

Цитата Сообщение от vizinar Посмотреть сообщение
Как я понял этот способ работает с десятичными числами, а у меня данные вводятся уже в двоичной форме
Можно вводить и в двоичной форме, а затем преобразовывать в целое число с помощью std::bitset.
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
#include <iostream>
#include <string>
#include <bitset>
#include <cassert>
 
typedef uint8_t byte;
 
byte invertEvenSignificantBits(byte x)
{
    for (byte mask = 1; mask <= x && mask != 0; mask <<= 2)
        x ^= mask;
 
    return x;
}
 
byte rotateLeft(byte x, byte n)
{
    return (x << n) | (x >> (8-n));
}
 
int main()
{
    std::string binString;
    std::cin >> binString;
    unsigned long x = std::bitset<8>(binString).to_ulong();
    std::cout << "x = " << std::bitset<8>(x).to_string() << "\n";
 
    bool isPowerOfTwo = (x != 0) && ( (x&(x-1)) == 0 );
    x = isPowerOfTwo ? invertEvenSignificantBits(x) : rotateLeft(x, 2);
 
    std::cout << "y = " << std::bitset<8>(x).to_string() << "\n";
}
P.S. Исправил ошибку в 10 строке, заменив строгое неравенство на нестрогое.
1
0 / 0 / 2
Регистрация: 22.12.2014
Сообщений: 62
19.03.2017, 10:56  [ТС] 11
Все работает, всем спасибо
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <string> 
#include <stdint.h>
#include <cassert>
#include <stdio.h> 
#include <iostream> 
#include <cstdlib> 
#include <sstream> 
#include <bitset> 
using namespace std; 
 
typedef uint8_t byte;
const int size = 8; 
 
byte invertEvenSignificantBits(byte x)
{
    for (byte mask = 1; mask <= x && mask != 0; mask <<= 2)
        x ^= mask;
 
    return x;
}
 
byte rotateLeft(byte x, byte n)
{
    return (x << n) | (x >> (8-n));
}
 
int main() 
{ 
setlocale(LC_ALL, "Russian"); 
while (true) 
{ 
int a=0; 
int mas[size]; 
cout<<"\nВведите число по битам: "<<endl; 
int result=0; 
for (int i = 0; i < size; i++) 
{ 
cin>>mas[i]; 
if (mas[i]==1) 
{ 
result++; 
} 
} 
bool flag=false; 
 
if (result==1) 
{ 
flag=true; 
} 
cout << "Принятый код: ";
for (int i = 0; i < size; i++) 
{ 
cout<<mas[i]; 
} 
 
if (flag==true) // если флаг поднят
{ 
 
cout<<endl; 
cout<<"\nПреобразованный код: "<<endl; 
ostringstream ost; 
string s_num;
for (int i = 0; i <8; i++) 
{ 
ost << mas[i]; 
s_num = ost.str(); 
} 
unsigned long x = bitset<8>(s_num).to_ulong();
bool isPowerOfTwo = (x != 0) && ( (x&(x-1)) == 0 );
x = isPowerOfTwo ? invertEvenSignificantBits(x) : rotateLeft(x, 2);
cout << bitset<8>(x).to_string() << "\n";
} 
else{ 
//иначе 
cout<<"\nПреобразованный код:  "; 
ostringstream ost2; 
string s_num2;
for (int i = 0; i <8; i++) 
{ 
 
 
ost2 << mas[i]; 
s_num2 = ost2.str(); 
 
} 
 
cout<<bitset<8>(bitset<8>(s_num2).to_ulong()<<2).to_string(); 
//двигаем биты
 
} 
 
 
 
} 
 
system("pause"); 
}
0
0 / 0 / 2
Регистрация: 22.12.2014
Сообщений: 62
21.03.2017, 16:02  [ТС] 12
а как работает эта функция?
C++
1
2
3
4
5
6
7
byte invertEvenSignificantBits(byte x)
{
    for (byte mask = 1; mask <= x && mask != 0; mask <<= 2)
        x ^= mask;
 
    return x;
}
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
21.03.2017, 16:22 13
Переменная mask последовательно принимает значения 1, 100, 10000, и т. д., то есть содержащие одну единицу в чётных (считая с нуля) позициях. Операция x ^= mask инвертирует бит, содержащий эту единицу. Условие mask <= x нужно, чтобы инвертировались только значащие биты, а условие mask != 0 защищает от выхода маски из разрядной сетки (чрезмерного сдвига влево).
1
21.03.2017, 16:22
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.03.2017, 16:22
Помогаю со студенческими работами здесь

Произведение элементов массива с парными номерами
Помогите, пожалуйста. На 29 декабря нужно сдать , а я в С++ почти полный ноль(( Вот условия: ...

обчислить произведение элементов массива с парными номерами в С++
В одномерном массиве, который состоит из N целых элементов, обчислить произведение элементов...

Инвертировать 3,4,7,15 биты
Стоит задача &quot;Инвертировать 3,4,7,15 биты&quot; подскажите как сделать?

Инвертировать биты
Пишу для обучения небольшой класс на Python для работы с адресами и масками ipv4. Хранится...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Что такое HCL Notes и как с ним работать
InfoMaster 10.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой комплексную платформу для совместной работы и обмена информацией в корпоративной среде. Это многофункциональное решение,. . .
Как работать с Git из Windows и Visual Studio
InfoMaster 10.01.2025
Работа с Git в Windows Работа с Git в операционной системе Windows может быть осуществлена с помощью различных инструментов, каждый из которых обладает своими уникальными возможностями и. . .
Аналог оператора switch case в Python
InfoMaster 10.01.2025
Оператор switch case используется в программировании для выбора одного из нескольких вариантов исполнения кода. Однако в языке Python этот оператор отсутствует. Понимание аналогов switch case в. . .
Отличия абстрактного класса от интерфейса
InfoMaster 10.01.2025
В современной разработке программного обеспечения существуют два основных механизма реализации абстракции: абстрактные классы и интерфейсы. Эти инструменты, хотя и схожи в своей основной цели -. . .
Как работать в Git
InfoMaster 10.01.2025
Git — это одна из наиболее популярных систем контроля версий, которая активно используется разработчиками по всему миру. Она позволяет эффективно управлять изменениями в коде, координировать работу. . .
Реализация передвижения персонажа в Unity3d на C#
InfoMaster 10.01.2025
Реализация передвижения персонажа в Unity3D начинается с правильной настройки проекта. Этот этап критически важен для создания отзывчивого и плавного управления. Рассмотрим основные шаги для создания. . .
Docker: руководство для начинающих
InfoMaster 10.01.2025
В современном мире разработки программного обеспечения контейнеризация стала неотъемлемой частью процесса создания и развертывания приложений. Docker, как ведущая платформа контейнеризации, произвела. . .
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru