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

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

Войти
Регистрация
Восстановить пароль
 
andrrr
Сообщений: n/a
#1

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

26.11.2012, 01:08. Просмотров 637. Ответов 3
Метки нет (Все метки)

Ребят, помогите кто чем может. Дана строка unsigned char. Необходимо через каждых 4 бита вставить 1, при этом ничего не затерев.

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

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

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

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

Битовые операции - C++
Помогите, пожалуйста, написать код на C++! Дана последовательность из 8 байт: unsigned char n =...

Битовые операции - C++
#include<iostream> #include<climits> int main() { unsigned int a = UINT_MAX; unsigned short b = USHRT_MAX; std::cout <<...

Битовые операции - C++
Добрый день! Помогите пожалуйста написать программу. Дано короткое целое неотрицательное число(2 байта). Выполнить инверсию ...

3
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
26.11.2012, 01:13 #2
andrrr, почитайте про std::bitset. Хотя думать надо, как это проще реализовать.
0
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;
}
0
Croessmah
Эксперт CЭксперт С++
13415 / 7568 / 855
Регистрация: 27.09.2012
Сообщений: 18,631
Записей в блоге: 3
Завершенные тесты: 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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2012, 05:21
Привет! Вот еще темы с ответами:

Битовые операции - C++
Доброго времени суток . Вот такая вот задачка : в числе А установить в единицу n битов влево от позиции p, заменить ими m битов числа В,...

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

Битовые операции - C++
Есть число в двоичной системе, например &quot;01000001&quot;, рядом с единицами надо заменить нули на единички! то есть должно получится например...

Битовые операции. - C++
подскажите пожалуйста как сделать обратное преобразование после выполнения такого кода st=1; st = (st &gt;&gt; 16) &amp; 0x7fff; как...


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

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
26.11.2012, 05:21
Ответ Создать тему
Опции темы

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