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

Битовые операции - C++

Восстановить пароль Регистрация
 
andrrr
Сообщений: n/a
26.11.2012, 01:08     Битовые операции #1
Ребят, помогите кто чем может. Дана строка unsigned char. Необходимо через каждых 4 бита вставить 1, при этом ничего не затерев.

Получается мы идем по битам элемента строки, заносим бит, сдвигаем. В результате у нас остается 7-й бит, который не уместился в байте + еще один бит, который необходимо вставить. Они переносятся в следующий элемент строки и т.д. С каждым шагом битов, которые не вместились, все больше и больше.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2012, 01:08     Битовые операции
Посмотрите здесь:

битовые операции C++
C++ Битовые операции
C++ Битовые операции
Битовые операции C++
Битовые операции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
26.11.2012, 01:13     Битовые операции #2
andrrr, почитайте про std::bitset. Хотя думать надо, как это проще реализовать.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
26.11.2012, 02:53     Битовые операции #3
andrrr, если расписать на бумаге операцию установки битов, то видно, что периодичность повтора устанавливаемых значений равна 5. Каждые 5 байт нужно выполнить соответствующее побитовое ИЛИ. На Си пожалуйста, а вот на с++ с выводом однобайтовых хексов что-то не получается.
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
unsigned char *setbit (unsigned char *s)
{
#define SIZE_MASK_ARRAY (5)
    unsigned char mask[] = { 0x08, 0x42, 0x10, 0x84, 0x21 };
    unsigned char *ptr = s;
    size_t i = 0;
 
    while(*ptr) {
        *ptr |= mask[i % SIZE_MASK_ARRAY];
        i++;
        ptr++;
    }
#undef SIZE_MASK_ARRAY
    return s;
}
 
int main()
{
    unsigned char string[] = "this is a good string for example";
    unsigned char *ptr = string;
    size_t i, len = strlen(string);
 
    fputs("this is a source bytes of string\n", stdout);
    while( *ptr )
        printf("%X", *ptr++);
 
    fputs("\nthis is a modified bytes of string\n", stdout);
    ptr = setbit(string);
 
    while( *ptr )
        printf("%X", *ptr++);
 
    exit(EXIT_SUCCESS);
}
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
#include <iostream>
#include <string>
#include <iomanip>
 
void setbit (std::string &s, unsigned int len)
{
#define SIZE_MASK_ARRAY (5)
    std::string mask =
    {
        (char)0x08,
        (char)0x42,
        (char)0x10,
        (char)0x84,
        (char)0x21
    };
    unsigned int i = 0;
 
    while(i < len)
    {
        s[ i ] |= mask[i % SIZE_MASK_ARRAY];
        i++;
    }
#undef SIZE_MASK_ARRAY
}
 
int main()
{
    std::string str ("this is a good string for example");
    unsigned int i = 0, len = str.size();
 
    std::cout << "this is a source bytes of string\n" << '\n';
    while( i < len )
        std::cout << std::hex << (unsigned int)str[ i++ ];
    std::cout << '\n';
 
    std::cout << "this is a modified bytes of string\n" << '\n';
    i = 0;
    setbit(str, len);
 
    while( i < len )
        std::cout << std::hex << (unsigned int)str[ i++ ];
    std::cout << '\n';
 
    return 0;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
26.11.2012, 05:21     Битовые операции #4
Как вариант:
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
#include <iostream>
 
typedef unsigned char MUC;
 
void ShowBinnary(MUC num){
    for(MUC i=sizeof(num)*8;i>0;--i)
        std::cout<<((num & (1<<(int)(i-1)))!=0);
}
 
int main(){
    MUC str[]="abd";
    int MUC_BITS=sizeof(str[0])*8;
 
    ShowBinnary(str[0]);std::cout<<std::endl;
    ShowBinnary(str[1]);std::cout<<std::endl;
    ShowBinnary(str[2]);std::cout<<std::endl;
 
 
    int len=strlen((char*)str);
    MUC * pStr=new MUC[len*2];
    memset(pStr,0,len*2*sizeof(str[0]));
    int bVal;
    //Собственно, сам цикл перестановок
    for(int sd1=0,sd2=0;sd1<len*MUC_BITS;++sd1,++sd2){
        bVal=str[sd1/(MUC_BITS)] & (1<<MUC_BITS-1-(sd1%MUC_BITS));
        if(sd1%4==0 && sd1>0){
            pStr[sd2/(MUC_BITS)] |= (1<<MUC_BITS-1-(sd2%MUC_BITS));
            ++sd2;
        }
        if(bVal)
            pStr[sd2/(MUC_BITS)] |= (1<<MUC_BITS-1-(sd2%MUC_BITS));
    }
 
    
    std::cout<<std::endl;
    ShowBinnary(pStr[0]);std::cout<<std::endl;
    ShowBinnary(pStr[1]);std::cout<<std::endl;
    ShowBinnary(pStr[2]);std::cout<<std::endl;
    ShowBinnary(pStr[3]);std::cout<<std::endl;
 
    std::cout<<std::endl;
    delete [] pStr;
    //delete [] bitmask;
    system("pause");
    return 0;
}
Yandex
Объявления
26.11.2012, 05:21     Битовые операции
Ответ Создать тему
Опции темы

Текущее время: 12:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru