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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Реализовать АТД Очередь с помощью массива http://www.cyberforum.ru/cpp-beginners/thread14784.html
Всем привет! у меня есть некоторые зарисовки, но никак не могу привести программу к концу. Задание: Реализовать АТД Очередь с помощью массива; Используя эту реализацию, написать функцию, которая за один проход по заданному целочисленному массиву выводит на печать его элементы в следующем порядке: сначала все четные, потом – нечетные.:umnik: кусочек программы который у меня есть:...
C++ Удаление динамической памяти В книгах по С++ я читал про утечку памяти. Я решил создать программу, в которой будет выделаться 1 Гб памяти и не удаляться. Будучи запущенной много раз, она так и не зависла. Для большей уверенности я поставил галочку release и запускал её не через F5, а через exe-файл. Получается, что в C++ есть сборщик мусора? P.S. Пользуюсь Visual Studio 2008. http://www.cyberforum.ru/cpp-beginners/thread14767.html
Какую и как использовать функцию, чтобы float сделать int? C++
Какую и как использовать функцию, чтобы float сделать int?
C++ Помогите разобраться с динамическими библиотеками
Здравсвуйте форумчане... т.к я еще молод и зелен прошу помочь тех кто разбирается в динамических библиотеках: что такое есть билиотека( у меня есть представления но все они расплывчатые :P )и помочь закончить 2 не работающих фаила (выделение, удаление памяти есть, чтение с фаила массива кое-как сам написал (возможны ошибки)...помогите написать вывод массива на экран и в фаил)... и пожалуста...
C++ Как узнать статус потока? http://www.cyberforum.ru/cpp-beginners/thread14709.html
добрый вечер, не подскажите, как узнать статус потока? Желательно, чтобы функция возвращала 0, если поток засуспендин, или 1 если он нормально работает.
C++ Арифметическое выражение Записать арифметическое выражение на языке C++ Можете написать пожалуйста Завтра последний день чтобы сдать комплексные подробнее

Показать сообщение отдельно
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2220 / 735 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
30.10.2008, 17:28     Существуют ли методы побитового сравнения строк?
Написал возможную реализацию. Ничего не оптимизировал,а если 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();
};
 
Текущее время: 01:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru