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

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

Войти
Регистрация
Восстановить пароль
 
 
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
#1

Битовые операции, найти ошибку в коде - C++

13.03.2014, 12:47. Просмотров 915. Ответов 31
Метки нет (Все метки)

Написал немного коду с битовыми операциями, чтобы заменять биты, но почему то работает не так как хотелось. Комментарии все в коде. В HEX редакторе получаются в основном одни FF, т.е. байты заполненные единичками. Алгоритм должен быть обратным, но не выходит.
key это интовская переменная
array это байтовый массив содержащих исходные данные (QByteArray array)
itog это байтовый массив измененных данных

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
void MainWindow::sh(int n)
{
 
int razr_0 = 1, razr_1 = 2, razr_3 = 8, razr_4 = 16; //для проверки значения тех разърядов которые подлжеат XOR
 
for(int i = 0; i < 8; i++) {
 
    int razr0 = razr_0 & key; //проверяем значения бит нужных разърядов
    int razr1 = razr_1 & key;
    int razr3 = razr_3 & key;
    int razr4 = razr_4 & key;
 
        int mlad_bit = razr_0 & array[n]; //младший бит элемента массива из файла
        array[n] = array[n] >> 1; //сдвигаем вправо, чтобы на следующем шаге опять проверять младший бит
 
        int nov_bit = razr4 ^ razr3 ^ razr1 ^ razr0;
        if(nov_bit == 1)
        {
            //получаем новый бит == 1
            key = key >> 1; //удаляем младший бит
            key = key | 2048; //добавляем старший разъряд
        }
        else
        {
            //получаем новый бит == 0
            key = key >> 1; //удаляем младший бит
        }
 
 
        //********************************************************************************
        int nov_kod_bit = mlad_bit ^ razr0;
        if(nov_kod_bit == 0)
        {
            itog[n] = itog[n] | 0;
            itog[n] = itog[n] >> 1;
        }
        else
        {
            itog[n] = itog[n] | 128;
            itog[n] = itog[n] >> 1;
        }
 
 
 
    }
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2014, 12:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Битовые операции, найти ошибку в коде (C++):

Арифметические операции, найти ошибку в коде - C++
Где ошыбка? #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; int main() { double mult = 1; int n = 1; ...

Как представлять двоичные числа в обратном и дополнительном коде, используя битовые операции? - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;algorithm&gt; using namespace std; int main() { int n; cout &lt;&lt; &quot;Enter...

Битовые операции (написать функцию для сброса в ноль двух битов с заданными номерами в коде символа) - C++
Вот наткнулся на интересную задачку: &quot;Написать функцию для сброса в ноль двух битов с заданными номерами в коде символа&quot; Во-первых...

Битовые операции, битовые поля. - C++
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций. Записать в unsigned int. Использовать...

Битовые операции и операции смещения языка С - C++
Доброго времени суток господа,помогите пожалуйста.Есть 2 кода к задаче,первый работает верно(переводит обычные числа в 16-ти ричные),а...

Битовые операции - C++
Имеется число int x = 85; // 1010101 - двоичное представление // 6543210 - номера битов // нужно взять // 0,2,3,4 биты и сложить...

31
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
16.03.2014, 17:18  [ТС] #16
ValeryS, можете ещё раз написать, не совсем понятна фраза "ну и как это как" и "это сложение вычитание И ИЛИ'. Операнды все в стандарте определены, которые я использую, если вы про это. А если вам надо пояснить, какой операнд, что значит : | побитовое ИЛИ, & побитовое И, ^ исключающее ИЛИ.
0
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,086
16.03.2014, 18:35 #17
танкист34,
еще раз это,я у тебя хочу спросить
Цитата Сообщение от танкист34 Посмотреть сообщение
берём биты: первый, второй, четвёртый и пятый от key. Их ксорим XOR.
Полученное значение(бит) добавляем в переменную key, в старший разъряд.
4 бита итого 16 комбинаций
как из них получить один бит когда он равен 1 и когда равен 0???

Добавлено через 9 минут
Цитата Сообщение от танкист34 Посмотреть сообщение
int razr_0 = 1, razr_1 = 2, razr_3 = 8, razr_4 = 16;
эти волшебные числа заменяются вот такой конструкцией
C++
1
int razr_0 = 1<<0, razr_1 = 1<<1, razr_3 = 1<<3, razr_4 = 1<<4;
а равно и это
Цитата Сообщение от танкист34 Посмотреть сообщение
key = key | 2048;
C++
1
key = key | (1<<11);
а можно и вот так сделать
C++
1
2
3
4
5
6
7
const r1=0;
const r2=1;
const r3=3;
const r4=4;
const rA=11;
......................................
int razr_0 = 1<<r1, razr_1 = 1<<r2, razr_3 = 1<<r3, razr_4 = 1<<r4;
..............................
key = key | (1<<rA);[/CPP]

тогда если будут нужны другие разряды то просто в одном месте поменяешь а не будешь лазить по всему листингу
0
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
16.03.2014, 18:48  [ТС] #18
ValeryS,
"эти волшебные числа заменяются вот такой конструкцией"
меня сейчас мало интересует такая запись кода, тем более суть не меняется, а запись длиньше и не понятна на восприятие.
"еще раз это,я у тебя хочу спросить"
там если посмотреть, то можно увидеть условие. Если нулей больше чем единиц, то будет единица, и наоборот. А если нулей и единиц поровну, то будет ноль. Причём здесь 16 комбинаций?! Если вы про порядок следования, то он не имеет значения. То что 16 комбинаций это не говорит о том, что есть 16 вариантов.
0
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,086
16.03.2014, 19:15 #19
Цитата Сообщение от танкист34 Посмотреть сообщение
там если посмотреть, то можно увидеть условие.
это вот это что ли?
Цитата Сообщение от танкист34 Посмотреть сообщение
int nov_bit = razr4 ^ razr3 ^ razr1 ^ razr0;
if(nov_bit == 1)
у тебя то сработает если в key будет число 00x01 допустим 00001
никаких больше меньше
смотри
int razr0 = razr_0 & key; 00001& 00001=1;
int razr1 = razr_1 & key; 00001& 00010=0
int razr3 = razr_3 & key; 00001& 01000=0
int razr4 = razr_4 & key; 00001& 10000=0
теперь
int nov_bit = razr4 ^ razr3 ^ razr1 ^ razr0;

0^0^0^0=1
другое число 10000
int razr0 = razr_0 & key; 10000& 00001=0;
int razr1 = razr_1 & key; 10000& 00010=0
int razr3 = razr_3 & key; 10000& 01000=0
int razr4 = razr_4 & key; 10000& 10000=10000

int nov_bit = razr4 ^ razr3 ^ razr1 ^ razr0;

10000^0^0^0=10000

единиц меньше чем 0 но условие уже не выполняется
ты же разряды не подгоняешь
да и XOR здесь неуместен он сможет проверить только четное нечетное количество единиц

вот примерно как нужно

C++
1
2
3
4
5
6
7
8
9
int nov_bit=key&0x01; // выделяем младший бит
nov_bit=nov_bit+((key>>1)&0x01); // сдвигаем чтобы второй бит стал младшим выделяем его и плюсуем
nov_bit=nov_bit+((key>>3)&0x01); // сдвигаем чтобы четвертый бит стал младшим выделяем его и плюсуем
nov_bit=nov_bit+((key>>4)&0x01); // сдвигаем чтобы пятый бит стал младшим выделяем его и плюсуем
 
if(nov_bit>2)
 // количество единиц больше 0
else
// количество единиц меньше или равно количеству нулей
0
Alex5
1075 / 739 / 115
Регистрация: 12.04.2010
Сообщений: 1,892
16.03.2014, 20:43 #20
Цитата Сообщение от танкист34 Посмотреть сообщение
вызываю вот так:
C++
1
2
3
4
5
6
7
8
9
for(int n = 0; n < size_array; n++)
 {
 itog[n] = 0; //предварительное обнуление
 }
/* Чему равно key в этот момент для 1-го и для 2-го вызова?*/
for(int n = 0; n < size_array; n++)
 {
 itog[n] = sh(array, n);
 }
танкист34, можете привести конкретный численный пример?
Вход: key, array[], itog[]. Результат на выходе: key, array[], itog[]. Конкретные численные значения?
Теперь хотим восстановить исходный массив.
Вход: key, array[], itog[]. Результат на выходе: key, array[], itog[].
0
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
17.03.2014, 16:43  [ТС] #21
Вот, как говорится, на бумаге:

имеем ключ допустим вида: 111000111000 это 3640 в десятички. Ключ одинаков при первом запуске и при втором!!!
Далее, не буду всю решётку битовую переменной int расписывать, но один раз напишу, чтобы отпали подобные вопросы: 00000000000000000000111000111000 вот так ключ хранится. Хух
1^1^0^0 это операция исключающего ИЛИ 1го,2го, 4го, 5го разъряда(если смотреть с первого)
1)получили 0 (думаю таблица истинности не нужна)
2)перед свдигом ключа запоминаем нулевой бит(первый) он 0
3)ксорим этот 0 с первым битом файла(первым битом массива array) и записываем результат в первый бит itog.
4)записываем 0 полученый на шаге один, пишем в 11 разъряд, если нумеровать с нуля.(предварительно сдвину ключ на 1 разъряд вправо)
далее шаги повторяются по циклу, пока не закончатся биты массива array.
А назад, происходит точно также.. ключ тот же только на входе уже array == itog полученный на предыдущем этапе.

Добавлено через 8 минут
Alex5,
Цитата Сообщение от Alex5 Посмотреть сообщение
/* Чему равно key в этот момент для 1-го и для 2-го вызова?*/
key одинаково, значение вводится с клавиатуры.
0
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,086
17.03.2014, 17:11 #22
ты вообще читаешь что тебе пишут?
Цитата Сообщение от танкист34 Посмотреть сообщение
1^1^0^0 это операция исключающего ИЛИ 1го,2го, 4го, 5го разъряда(если смотреть с первого)
покажи как ты это реализуешь в коде?
если вот так
Цитата Сообщение от танкист34 Посмотреть сообщение
int razr0 = razr_0 & key; //проверяем значения бит нужных разърядов
* * int razr1 = razr_1 & key;
* * int razr3 = razr_3 & key;
* * int razr4 = razr_4 & key;
........
int nov_bit = razr4 ^ razr3 ^ razr1 ^ razr0;
то это не правильно
Цитата Сообщение от танкист34 Посмотреть сообщение
далее шаги повторяются по циклу, пока не закончатся биты массива array.
массив array это что?
как это
Цитата Сообщение от танкист34 Посмотреть сообщение
1^1^0^0 это операция исключающего ИЛИ 1го,2го, 4го, 5го разъряда(если смотреть с первого)
1)получили 0 (думаю таблица истинности не нужна)
соотносится с этим
Цитата Сообщение от танкист34 Посмотреть сообщение
Если нулей больше чем единиц, то будет единица, и наоборот.
0
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
17.03.2014, 17:29  [ТС] #23
ValeryS, почему вы тыкаете??? тем более не по теме, тему читайте внимательно, пожалуйста, прежде чем показывать свою безтактность. Я выложил уже другой код в котором эту ошибку исправил
Цитата Сообщение от ValeryS Посмотреть сообщение
int nov_bit = razr4 ^ razr3 ^ razr1 ^ razr0;
, мне на неё указали ещё в начале.

Добавлено через 3 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
массив array это что?
это массив исходных данных (произвольный)

Добавлено через 7 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
как это соотносится с этим
соотносится, могу привести пример со школьного курса, вроде в учебнике вот так:
даётся таблица истинности:
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
Далее, пример1 0 ^ 0 ^ 0 ^ 1 получим 1 независимо от последовательности. Это необходимо, но не достаточно.
Далее, пример2 1 ^ 1 ^ 1 ^ 0 получим 1 Это необходимо, но не достаточно.
В сумме пример 1 и 2 это необходимо и достаточно для получения единицы.
А ноль будет, когда нулей и единиц поровну (для 4х битовой сетки). Это необходимо и достаточно.
Вот откуда и берётся это условие. Я вам могу так сказать, в программировании не обязательно действия выполнять напрямую, иногда достаточно правильной интерпретации.
0
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,086
17.03.2014, 18:07 #24
я отваливаю, не желаю участвовать
а это
Цитата Сообщение от танкист34 Посмотреть сообщение
Если нулей больше чем единиц, то будет единица, и наоборот.
и это
Цитата Сообщение от танкист34 Посмотреть сообщение
Далее, пример1 0 ^ 0 ^ 0 ^ 1 получим 1 независимо от последовательности. Это необходимо, но не достаточно.
Далее, пример2 1 ^ 1 ^ 1 ^ 0 получим 1 Это необходимо, но не достаточно.
В сумме пример 1 и 2 это необходимо и достаточно для получения единицы.
мой мозг принять не может
0
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
17.03.2014, 18:13  [ТС] #25
ValeryS, я не виноват, что он не может.. что вы от меня хотите? если 1 ^ 0 = 1 это не понятно, то это не ко мне, я не преподаватель. В этой теме не обсуждается таблица истинности XOR.
Могу только ссылкой помочь на литературу, где всё это описано:
Литература C++
Буду рад, если помог.
0
Alex5
1075 / 739 / 115
Регистрация: 12.04.2010
Сообщений: 1,892
17.03.2014, 18:14 #26
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
танкист34, вот пример. Возьмём key равным 10, array[] - массив из 4 элементов ( 1, 2, 3, 4 ).
Вот у меня что получается. Как видно на рис., работает. Исходный массив восстанавливается.
А какой у Вас получается itog[] для key: 10, array[]: { 1, 2, 3, 4 }

Может быть, причина не в MainWindow::sh(). Что будет, если вообще не использовать sh()?
C++
1
2
3
4
5
6
        for(int n = 0; n < size_array; n++)
        {
            ++key;
            itog[n] = array[n] ^ key;
           // itog[n] = sh(array, n);  // временно уберём эту строку 
        }
Если после того, как убрали sh(), ошибка пропала, то возможно причина в исходной sh(). Если ошибка сохранилась, значит причина не в MainWindow::sh(), а где-то в другом месте.
1
Миниатюры
Битовые операции, найти ошибку в коде  
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
17.03.2014, 18:22  [ТС] #27
Alex5, благодарю вас, буду пробывать, а на диалог с ValeryS, не обращайте внимание, он мне тычит на ошибку которую вы мне указали, её я устранил ещё вначале. (все люди ошибаются).
0
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,086
17.03.2014, 18:55 #28
танкист34,
переведи вот эту фразу
Цитата Сообщение от танкист34 Посмотреть сообщение
Если нулей больше чем единиц, то будет единица, и наоборот.
и какое отношение это имеет к ИСКЛЮЧЮЩЕМУ ИЛИ?
0
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
17.03.2014, 19:03  [ТС] #29
ValeryS, пример я привёл выше, и ссылку на книжки дал, почитайте основы и поймёте. Больше я ничем помочь не могу, я считаю, что надо всегда исходить из основ, а не с конца начинать.
будете дальше тыкать, я вам отвечать не буду. Относитесь уважительно, также как и я к вам.
0
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,086
17.03.2014, 19:05 #30
танкист34, спасибо что просветил, но я уж как то со своими знаниями и Булевой алгеброй проживу
1^1^1^0=1 единиц больше чем нулей
1^0^0^0=1 единиц меньше чем нулей

Все отваливаю
0
17.03.2014, 19:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 19:05
Привет! Вот еще темы с ответами:

Битовые операции - C++
Собсно,если используется 4 байтовая переменная,то почему она представлена 16 битами(1010 0110 0010 0110),а не 32 битами?

Битовые операции - C++
Здравствуйте, необходимо разбить двухбайтное целое число на тетрады и поменять местами 2 и 3 тетрады, оставив без изменения 1 и 4. Есть...

Битовые операции - C++
Здраствуйте, помогите, пожалуйста! Надо написать три функции, используя только битовые (для первых двух) и только битовые и...

Битовые операции - C++
Задание: Как я понимаю надо создать объект типа int, но как менять местами биты вообще не представляю, помогите пожалуйста.


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

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

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