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

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

18.03.2017, 20:03. Показов 2226. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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,706
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2017, 16:22
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru