Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> конструктор bitset, непонятно как работает 
:(
    Опции темы
redwhite90
Дата 27.10.2011, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



помогите разобраться пожалста
я пишу:
Код

bitset<18> m1("100111000011111000");
bitset<6> m2(m1.to_string(),2,6);

то есть как я понял m2 берет из m1 начиная со второго 6 битов и инициализирует себя ими.
тогда:
m1 = [18](0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1)
m2 = [6] (0,0,1,1,1,0)


беру второй пример:
Код

bitset<6> cont ;//единичный битсет(6 бит)

    for(int i=0;i<8;i++)//разбиваем на блоки по 6
    {
        
        cont=(mybits_result.to_string(),48-6*i,6);
                           ........
              }


рассмотрим 1(i=0) итерацию:
mybits_result = [48](1,1,1,0,0,1,0,0,1,1,0,1,1,1,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,1,1,1,1,1,1,0,1,1,0,0,0,0,0)
как я понял в cont должно оказаться начиная с самого правого бита mybits_result последовательно 6 битов то есть:
1,0,0,0,0,0
а на деле выходить вот что:
cont = [6](0,1,1,0,0,0)

в чем ошибка?

Добавлено @ 13:30
Код

for(int j=0 ; j<6 ; j++ )
            cont[j]=mybits_result[48-6*(i+1)+j];


а такой цикл выдаёт, что нужно

Это сообщение отредактировал(а) redwhite90 - 27.10.2011, 13:40
PM MAIL   Вверх
mes
Дата 27.10.2011, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(redwhite90 @  27.10.2011,  12:18 Найти цитируемый пост)
рассмотрим 1(i=0) итерацию
...,48-6*i,6

диапазон с 48го по 54й символ находится за пределами вашего массива/строки..

Добавлено через 1 минуту и 17 секунд
аккуратней с математикой..

Это сообщение отредактировал(а) mes - 27.10.2011, 13:48


--------------------
PM MAIL WWW   Вверх
redwhite90
Дата 27.10.2011, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



Код

cont=(mybits_result.to_string(),48-6*(i+1),6);

ничего не поменялось

Добавлено через 6 минут и 31 секунду
Цитата(mes @  27.10.2011,  13:47 Найти цитируемый пост)
диапазон с 48го по 54й символ находится за пределами вашего массива/строки..

не включительно

PM MAIL   Вверх
mes
Дата 27.10.2011, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(redwhite90 @  27.10.2011,  13:15 Найти цитируемый пост)
ничего не поменялось

все нормально работает :
http://liveworkspace.org/code/50769f6fa2d0...e6dd1ae8409c28e

7 (вместо 6) из за пробела.. для наглядности 


Добавлено через 1 минуту и 4 секунды
Цитата(redwhite90 @  27.10.2011,  13:15 Найти цитируемый пост)
не включительно

с индексом 48 уже за пределами ваших полезных данных..так что включительно.. 




--------------------
PM MAIL WWW   Вверх
redwhite90
Дата 27.10.2011, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



Цитата(mes @  27.10.2011,  15:21 Найти цитируемый пост)
с индексом 48 уже за пределами ваших полезных данных..так что включительно.. 

я про 54
Цитата(mes @  27.10.2011,  15:21 Найти цитируемый пост)
все нормально работает :http://liveworkspace.org/code/50769f6fa2d0...e6dd1ae8409c28e

тут немного не такой пример....
вот моя функция:
Код

void F(string &R,string K)
{
    E_activ(R);//расширяем R по закону E
    bitset<2> mybits_2;
    bitset<4> mybits_4;
    string test_string;
    bitset<48> mybits_R(R);
    bitset<48> mybits_K(K);
    bitset<48> mybits_result;
    int str=-1;
    int stlb=-1;
    bitset<4> m[8];
    mybits_result=(mybits_R^=mybits_K);//XOR
    bitset<6> cont ;//единичный битсет(6 бит)
    vector<bitset<6>> mas_of_6bit; //массив битсетов
    for(int i=0;i<8;i++)//разбиваем на блоки по 6
    {

        //cont=(mybits_result.to_string(),48-6*(i+1),6);
        for(int j=0 ; j<6 ; j++ )
            cont[j]=mybits_result[48-6*(i+1)+j];
        mas_of_6bit.push_back(cont);//записали 1 битсет
        mybits_2[0] = mas_of_6bit[i][0];//
        mybits_2[1] = mas_of_6bit[i][5];//получили 1 и последний бит
        mybits_4=(static_cast<bitset<4>>(mas_of_6bit[i].to_string(),1,4) );//средние биты
        str=mybits_2.to_ulong();
        stlb=mybits_4.to_ulong();
        m[i]=S[i][str][stlb];
    }
     //делаем перестановку 
    R=relocation_f(m);
}

цикл и конструктор по идее должны одно и то же выполнять. Но если раскомментить 
Код

//cont=(mybits_result.to_string(),48-6*(i+1),6);

а цикл закомментить, то программа начинает неправильно работать. Да и в отладке я это смотрел.
Код

//cont=(mybits_result.to_string(),48-6*(i+1),6);
        for(int j=0 ; j<6 ; j++ )
            cont[j]=mybits_result[48-6*(i+1)+j];

PM MAIL   Вверх
mes
Дата 27.10.2011, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(redwhite90 @  27.10.2011,  14:33 Найти цитируемый пост)
а цикл закомментить, то программа начинает неправильно работать

у меня с Вашими "расчетами" оба варианта дают одинаковый результат. :
http://liveworkspace.org/code/d4412c23fc6c...d7841777fc67a06


--------------------
PM MAIL WWW   Вверх
redwhite90
Дата 27.10.2011, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



мммм....а как такое может быть?


попробую debug удалить

Добавлено через 1 минуту и 15 секунд
не помогло

Добавлено через 2 минуты и 51 секунду
Цитата(mes @  27.10.2011,  15:55 Найти цитируемый пост)
Цитата(redwhite90 @  27.10.2011,  14:33 )а цикл закомментить, то программа начинает неправильно работатьу меня с Вашими "расчетами" оба варианта дают одинаковый результат. :http://liveworkspace.org/code/d4412c23fc6c...d7841777fc67a06



у меня то в общем то тоже - в тестовом проекте всё работает, а в основном не работает.

Добавлено через 5 минут и 36 секунд
если интересно - могу всю программу показать.

Код

# include <iostream>
# include <fstream>
# include <assert.h>
# include <string>
# include <bitset>
# include <vector>
using namespace std;

const int SIZE=64;
const int SMALL_SIZE=SIZE*3/4;

int begin_relocation[SIZE];//начальная перестановка
int end_relocation[SIZE];//конечная перестановка
int expansion[SMALL_SIZE];//функция расширения
int S[8][4][16];//трёхмерный массив из 8 двумерных массивов 4 X 16
int P[SIZE/2];//функция перестановки P
int B[SIZE-8];//функция перестаbновки ключа и выбора нужных бит
int Si[SIZE/4];//функция сдвига ключа
int K[SMALL_SIZE];//функция перестановки ключа
string KEYS[16];//массив ключей
string code;//некодированная строка
string key;//ключ 
int  E[SIZE];//
void read_parametres();
void relocation(string &str,int X[]);
void relocation_key(string &str,int X[]);
void read_key_string();
void encryption();
void descryption();
void shift_key(int number);//сдвиг ключа в зависимости от ...
void F(string &R,string K);//32 48
void E_activ(string & R);//функция расширения
void del_key_1_8(string &str);//убираем каждый восьмой ключ
string sample_key();
string relocation_f(bitset<4>[8]);
int main()
{
    read_parametres();
    read_key_string();
    string key_old=key;
    cout << "letter:"<<code<<endl;
    encryption();//функция шифрования
    cout << "code  :"<<code << endl;
    key = key_old;
    descryption();//функция Дешифрования
    cout << "decode:"<<code << endl;
    return 0;
}
void read_parametres()
{
    ifstream f;
    f.open("перестановки.txt");
    if(!f.is_open())
        assert("1");
    string str;
    getline(f,str);
    int i=0,j=0;
    //начальная перестановка
    for(int i=0;i<SIZE;i++)
            f>>begin_relocation[i];
     getline(f,str);
     getline(f,str);
    //конечная перестановка
    for(int i=0;i<SIZE;i++)
        f>>end_relocation[i];
     getline(f,str);
     getline(f,str);
    //функция расширения
    for(int i=0;i<SMALL_SIZE;i++)
        f>>expansion[i];
    //s1....s8
    for(int k=0;k<8;k++)
    {
        getline(f,str);
        getline(f,str);
         for(int i=0;i<4;i++)
             for(int j=0;j<16;j++)
                 f >> S[k][i][j];
    }
    //функция перестановки P
    getline(f,str);
    getline(f,str);
    for(int i=0;i<SIZE/2;i++)
        f>>P[i];
    //функия перестановки ключа и отсечения 1/8 бита
    getline(f,str);
    getline(f,str);
    for(int i=0;i<SIZE-8;i++)
        f>>B[i];
    //функия сдвига ключа
    getline(f,str);
    getline(f,str);
    for(int i=0;i<SIZE/4;i++)
        f>>Si[i];
    //функия перестановки ключа ключа
    getline(f,str);
    getline(f,str);
    for(int i=0;i<SMALL_SIZE;i++)
        f>>K[i];
    f.close();
    
}
void relocation(string &str,int X[])
{
    string tmp=str;
    for(unsigned int i=0;i<str.length();i++)
    {
        str[i]=tmp[X[i]-1];
    }
}
void relocation_key(string &str,int X[])
{
    string tmp=str;
    for(unsigned int i=0;i<str.length()-8;i++)
    {
        str[i]=tmp[X[i]-1];
    }
    str.resize(str.length()-8);
}
void read_key_string()
{
    ifstream f;
    f.open("входные_данные.txt");
    if(!f.is_open())
        assert("2");
    getline(f,code);
    getline(f,code);
    getline(f,key);
    getline(f,key);
    f.close();
}
void encryption()
{
    relocation(code,begin_relocation);//начальная перестановка
    string R,L,R_old;
    R.insert(0,code,32,32);
    L.insert(0,code,0,32);
    relocation_key(key,B);//перестановка ключа
    string k;
    for(int i=0 ; i<16 ; i++)
    {
        //получение ключа
        shift_key(Si[i]);//сдвиг ключа в зависимости от итерации
        
        KEYS[i]=sample_key();//выборка ключа
        R_old=R;
        F(R,KEYS[i]);
        R=((static_cast<bitset<32>>(L))^=(static_cast<bitset<32>>(R))).to_string();
        L=R_old;
    }
    code=L+R;
    relocation(code,end_relocation);
}
void descryption()
{
    relocation(code,begin_relocation);//начальная перестановка
    string R,L,L_old;
    R.insert(0,code,32,32);
    L.insert(0,code,0,32);
    relocation_key(key,B);//перестановка ключа
    //получение ключа
    for(int i=0;i<16;i++)
    {
        shift_key(Si[i]);//сдвиг ключа в зависимости от итерации
        KEYS[i]=sample_key();//выборка ключа
    }
    for(int i=0 ; i<16 ; i++)
    {
        L_old=L;
        F(L,KEYS[15-i]);
        L=((static_cast<bitset<32>>(R))^=(static_cast<bitset<32>>(L))).to_string();
        R=L_old;
    }
    code=L+R;
    relocation(code,end_relocation);//конечная перестановка
}
void F(string &R,string K)
{
    E_activ(R);//расширяем R по закону E
    bitset<2> mybits_2;
    bitset<4> mybits_4;
    string test_string;
    bitset<48> mybits_R(R);
    bitset<48> mybits_K(K);
    bitset<48> mybits_result;
    int str=-1;
    int stlb=-1;
    bitset<4> m[8];
    mybits_result=(mybits_R^=mybits_K);//XOR
    bitset<6> cont ;//единичный битсет(6 бит)
    vector<bitset<6>> mas_of_6bit; //массив битсетов
    for(int i=0;i<8;i++)//разбиваем на блоки по 6
    {

        //cont=(mybits_result.to_string(),48-6*(i+1),6);
        for(int j=0 ; j<6 ; j++ )
            cont[j]=mybits_result[48-6*(i+1)+j];
        mas_of_6bit.push_back(cont);//записали 1 битсет
        mybits_2[0] = mas_of_6bit[i][0];//
        mybits_2[1] = mas_of_6bit[i][5];//получили 1 и последний бит
        mybits_4=(static_cast<bitset<4>>(mas_of_6bit[i].to_string(),1,4) );//средние биты
        str=mybits_2.to_ulong();
        stlb=mybits_4.to_ulong();
        m[i]=S[i][str][stlb];
    }
     //делаем перестановку 
    R=relocation_f(m);
}
string relocation_f(bitset<4>m[8])//на вход - массив из 4 битных битсетов
{//выход - строка с переставленными битами по закону P
    string s,s2;
    for(unsigned int i=0;i<8;i++)
        s+=m[i].to_string();//преобразовали в строку - теперь  делаем перестановку
    s2=s;
    for(unsigned int i=0;i<s2.length();i++)
        s[i]=s2[P[i]-1];
    return s;
}
void shift_key(int number)//сдвиг ключа влево на n позиций
{
    string key_copy=key;
    for(int i=0;i<28;i++)
    {
            if((i+number)<0)
                key[i]=key_copy[28-(i+number)];
            else
                key[i]=key_copy[(i+number)%28];
    }
    for(int i=28;i<56;i++)
    {
        if((i+number)<0)
            key[i]=key_copy[56-(i+number)];
        else
            key[i]=key_copy[(i+number)%56];
    }
}
void E_activ(string &R)//функция расширения
{
    R.resize(48);
    string R_copy=R;
    for(int i=0;i<48;i++)
        R[i]=R_copy[expansion[i]-1];
}
void del_key_1_8(string &str)
{
    int k=7;
    for(int i=0;i<8;i++)
        str.erase(k+i*7,1);
}
string sample_key()
{
    string key_copy;
    key_copy.resize(48);
    for(int i=0;i<48;i++)
        key_copy[i]=key[K[i]-1];
    return key_copy;
}

PM MAIL   Вверх
mes
Дата 27.10.2011, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(redwhite90 @  27.10.2011,  14:59 Найти цитируемый пост)
у меня то в общем то тоже - в тестовом проекте всё работает, а в основном не работает. 

ну так значит ошибкане в том месте зарыта )



--------------------
PM MAIL WWW   Вверх
redwhite90
Дата 27.10.2011, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



всё самое интересное в строках 195-197

Добавлено через 1 минуту и 8 секунд
а в чём она может быть тогда зарыта если в отладке в cont попадает не то, что надо.
а после прохождения цикла - то что надо
PM MAIL   Вверх
mes
Дата 27.10.2011, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(redwhite90 @  27.10.2011,  15:06 Найти цитируемый пост)
а в чём она может быть тогда зарыта если в отладке в cont попадает не то, что надо.
а после прохождения цикла - то что надо 

в разном порядке расположения данных в строке и в битсете  smile 




--------------------
PM MAIL WWW   Вверх
redwhite90
Дата 27.10.2011, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



я учёл, что порядок инверсный
PM MAIL   Вверх
mes
Дата 27.10.2011, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(redwhite90 @  27.10.2011,  15:18 Найти цитируемый пост)
я учёл, что порядок инверсный 

однако в приведенном выше коде это не учтено..  smile 



--------------------
PM MAIL WWW   Вверх
redwhite90
Дата 27.10.2011, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



я же в 1 сообщении написал
тестовый проект:
Код

bitset<18> m1("100111000011111000");
bitset<6> m2(m1.to_string(),2,6);

m1 = [18](0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1)
m2 = [6] (0,0,1,1,1,0)
рабочий проект:

Код

cont=(mybits_result.to_string(),48-6*(i+1),6);//будем считать что i=0

mybits_result = [48](1,1,1,0,0,1,0,0,1,1,0,1,1,1,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,1,1,1,1,1,1,0,1,1,0,0,0,0,0)
cont = [6](0,1,1,0,0,0)
PM MAIL   Вверх
mes
Дата 27.10.2011, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(redwhite90 @  27.10.2011,  15:50 Найти цитируемый пост)
я же в 1 сообщении написал
тестовый проект:

мне лично лень запоминать и разбираться в числах..

Цитата(redwhite90 @  27.10.2011,  14:59 Найти цитируемый пост)

        //cont=(mybits_result.to_string(),48-6*(i+1),6);
        for(int j=0 ; j<6 ; j++ )
            cont[j]=mybits_result[48-6*(i+1)+j];


при разном порядке, как расчет позиции может быть одинаковым ?


P.S. когда приводил примеры выше, я не видел что mybits_result у Вас битсет и полагал что это строка.. 



--------------------
PM MAIL WWW   Вверх
redwhite90
Дата 27.10.2011, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



Цитата(redwhite90 @  27.10.2011,  13:18 Найти цитируемый пост)

m1 = [18](0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1)
                    m2 = [6] (0,0,1,1,1,0)


тут понятно откуда эти биты появились, 



mybits_result = [48](1,1,1,0,0,1,0,0,1,1,0,1,1,1,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,1,1,1,1,1,1,0,1,1,0,0,0,0,0)
cont =          [6](0,1,1,0,0,0)

а тут я  в контейнере 1 раз только такую последовательность вижу и совсем не там


Это сообщение отредактировал(а) redwhite90 - 27.10.2011, 17:20
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0710 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.