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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.77
Olenka_foxy
0 / 0 / 0
Регистрация: 08.04.2008
Сообщений: 13
#1

Существуют ли методы побитового сравнения строк? - C++

29.10.2008, 09:32. Просмотров 3805. Ответов 5
Метки нет (Все метки)

Существуют ли методы побитового сравнения строк? Нужно искать и сравнивать комбинацию 126 бит. Комбинация известна. А сравнивать надо с одержимым файла. Как сделать это?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2008, 09:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Существуют ли методы побитового сравнения строк? (C++):

Написать программу, использующую стандартную функцию сравнения строк для определения среди трех строк, вводимых пользователем, одинаковых. - C++
Написать программу, использующую стандартную функцию сравнения строк для определения среди трех строк, вводимых пользователем, одинаковых.

сравнения строк - C++
Всем привет !! столкнулся с проблемой сравнения строки, объясните пожалуйста как правильно сравнить строки на етом примере ...

Функция сравнения двух строк - C++
Написать функцию сравнения двух строк, используя указатели на них. Прошу помочь написать код программа для заданного условия

Программа сравнения двух строк - C++
Написать программу сравнения двух строк на языке с++ помогите, пожалуйста

не работает функция сравнения строк - C++
В функции, отвечающей за удаление страны из списка не хочет работать часть поиска нужной страны из общего списка. Подскажите в чем ошибка ...

Создать функцию сравнения строк - C++
создать функцию сравнения строк a и b bool is greater (char*a, char*b) если a<=b то возвращает true иначе false

5
Xentar
Of Wolf and Man
993 / 188 / 4
Регистрация: 09.07.2008
Сообщений: 1,885
29.10.2008, 11:09 #2
Зная то что строка это символьный массив, и то что один символ кодируется одним байтом, то посимвольное сравнение - в принципе и будет побитовым сравнением...
!
Или я чтото где то недопонял
0
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
29.10.2008, 11:25 #3
126 бит - это 15 байт + 6 бит. 15 байт сравниваете побайтно,6 бит - выделяете с помощью побитовых операций.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
29.10.2008, 12:33 #4
Да нет, не так все просто....
Вот пример:
- байты в файле (бинарный вид, правильностью старший-младший пока не занимаемся):
00011111 11111111 11111111 .... 11111111 11111111 10000000
- маска (искомые 126 бит): 11111111 11111111 ..... 11111111 111111(00)
При побайтовом сравнении - не найдем.
При побитовом - найдем, начиная с 3-го бита.
0
Olenka_foxy
0 / 0 / 0
Регистрация: 08.04.2008
Сообщений: 13
30.10.2008, 09:31  [ТС] #5
CheshireCat прав! Я тоже так понимаю. Как же это осуществить?...
0
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
30.10.2008, 17:28 #6
Написал возможную реализацию. Ничего не оптимизировал,а если rev_int переписать чуток,будет переносима на 16- и 64-битные платформы.скорее всего Надеюсь,комментарии на моем английском не будут проблемой.
Код
inline unsigned int rev_int(unsigned  int a ) {
/// switching bytes to right order.
    int b=a;
    unsigned char * pb =(unsigned char * ) &b;
    unsigned char tmp;
    tmp = pb[0];
    pb[0]= pb[3];
    pb[3]=tmp;
    tmp = pb[1];
    pb[1]=pb[2];
    pb[2]=tmp;
    return b;
};


bool bitcmp2(void * source,void * entry,int start_bit,int entry_len) {
    unsigned int * s = (unsigned int *)source;
    unsigned int * e = (unsigned int *)entry; // int pointers. Best and fastest for 32bit architecture.

    unsigned int wlen; // whole length mesured in dwords(for32bit)
    unsigned int plen; // particial length in dwords.

    unsigned int wstart;// whole shift from start of source in dwords
    unsigned int pstart;// particial shift from start of source in dwords

    unsigned int start_mask;//masks to realize it all
    unsigned int end_mask;

    unsigned int tmp; // whole dword will be extracted here from the source.
    unsigned int tmp2;
/*
     
  */
    wlen=entry_len/(sizeof(int)*8 );// 
    plen=entry_len%(sizeof(int)*8 );// simple maths

    wstart= start_bit/(sizeof(int)*8);
    pstart= start_bit%(sizeof(int)*8);// as well as here
    
    start_mask = (-1); // -1 = 0xFF.....F in bin. representation 
    start_mask>>=pstart;// first (pstart) bits of source do not matter.
//    rev_int(start_mask);
    end_mask = (-1); //same as here
    end_mask<<= ( (sizeof(int)*8 - plen ) );//the last bits of entry do not matter
    for(int i=0;i<wlen;i++) {// comparing full dwords
        /// first,extracting the start of next dword.
        /// then, reverse it( to make bytes be in natural order,intel reverses words &dwords in memory)
        /// after thet,apply the mask to get bits required
        // and split it using OR.
        // compare with reversed memory dword and return 0,if they aint equal
        tmp = (rev_int(s[wstart+i]) & start_mask) << pstart;
        tmp|= (rev_int(s[wstart+i+1] ) &(~start_mask) ) >> (sizeof(int)*8 - pstart);
        if(tmp!= rev_int(e[i]) ) return 0;    

    };
    //the difference between
    //cycle comparing
    //and this one is the end mask
    // we dont need end mask in cycle
    //but here we must skip last bits of input/output,cause they dont matter.
    //if we dont skip,we might get  a wrong answer.
    tmp = (rev_int(s[wstart+wlen]) & start_mask) << pstart;
    tmp|= (rev_int(s[wstart+wlen+1] ) &(~start_mask) ) >> (sizeof(int)*8 - pstart);
    if((tmp & end_mask )!= (rev_int( e[wlen])&end_mask ) ) return 0;


    return 1;
};
Тестовый пример :
Код
int main() {
     char * buffer ="\366\355\152\222\256\243";
     // buffer = 1111011 (here!)>01110110 10110101 01001001 01010111 01010...
     // entry =  01110110 10110101 01001001 01010111 0101
     char * entry = "\166\265\111\127\120";
    entry[1];
    for(int i=0;i<90;i++) {
        printf("%d ", bitcmp2(buffer,entry,i,36) );

    };
    getch();
};
0
30.10.2008, 17:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2008, 17:28
Привет! Вот еще темы с ответами:

Написать программу сравнения двух строк - C++
Написать программу сравнения двух строк.

Функция сравнения строк с разной длиной - C++
Создайте свою версию библиотечной функции strcmp(sl, s2), которая сравнивает две строки и возвращает -1, если s1 идет первой по алфавиту,...

Перегрузка оператора сравнения для строк - C++
В общем мне нужно сделать такую перегрузку, что бы вместо символа, например, &quot;&lt;&quot; выполнялось сравнение через strcmp, например строка...

Доделать программу, сравнения двух строк - C++
Задание: Написать программу с использованием функции, которая сравнивает две строки, заданные в качестве ее аргументов. Если аргумент...


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

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

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