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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
KupueIIIKo
2 / 2 / 0
Регистрация: 15.09.2010
Сообщений: 127
12.05.2011, 09:48     Битовые операции #1
Есть число в двоичной системе, например "01000001", рядом с единицами надо заменить нули на единички! то есть должно получится например "11100011"! Помогите нашкодить!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2011, 09:48     Битовые операции
Посмотрите здесь:

Битовые операции C++
Битовые операции, битовые поля. C++
C++ Битовые операции
C++ Битовые операции
битовые операции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
12.05.2011, 09:56     Битовые операции #2
Дык это строка или число?
Если число, то это просто:
C++
1
2
3
int a = 5;
a = ~a;
a = -a;
Либо так, либо эдак.
KupueIIIKo
2 / 2 / 0
Регистрация: 15.09.2010
Сообщений: 127
12.05.2011, 10:12  [ТС]     Битовые операции #3
~ делает побитовое инвертирование
- унарный минус
все нето!

Данный байт хранится допустим в переменной А; в шестнадцатеричном коде! Вообщем мы его переводим в двоичку! Находим единичку! Соседние биты тоже делаем единицами!
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.05.2011, 10:56     Битовые операции #4
Цитата Сообщение от KupueIIIKo
Вообщем мы его переводим в двоичку!
в строковое представление ?
тогда можно сделать простой цикл

C
1
2
3
4
5
6
7
8
9
10
    char num[100] = "010010010";
    int len = strlen(num);
 
    for (i = 0; i < len; i++)
        if (num[i] == '1') {
            if (i > 0 && num[i - 1] != '1')
                num[i - 1] = '1';
            if (i + 1 < len && num[i + 1] != '1')
                num[i + 1] = '1';
        }
KupueIIIKo
2 / 2 / 0
Регистрация: 15.09.2010
Сообщений: 127
12.05.2011, 11:01  [ТС]     Битовые операции #5
Цитата Сообщение от accept Посмотреть сообщение
в строковое представление ?
тогда можно сделать простой цикл

C
1
2
3
4
5
6
7
8
9
10
    char num[100] = "010010010";
    int len = strlen(num);
 
    for (i = 0; i < len; i++)
        if (num[i] == '1') {
            if (i > 0 && num[i - 1] != '1')
                num[i - 1] = '1';
            if (i + 1 < len && num[i + 1] != '1')
                num[i + 1] = '1';
        }
представление не строковое! но можно и так! спс! осталось цифру в массив и обратно в цифру загнать )
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.05.2011, 11:11     Битовые операции #6
Цитата Сообщение от KupueIIIKo
представление не строковое! но можно и так!
Цитата Сообщение от KupueIIIKo
Есть число в двоичной системе
если представление не строковое, то непонятно тогда, где есть число в двоичной системе
KupueIIIKo
2 / 2 / 0
Регистрация: 15.09.2010
Сообщений: 127
12.05.2011, 11:33  [ТС]     Битовые операции #7
Пишу прогу под микроконтроллер! Я получаю в переменную "a" значение например "0x3A" = "00111010", где каждый бит соответствует логическому нулю или единице на ножке микроконтроллера. Вот мне надо вывести на соседние ножки единички )
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.05.2011, 13:58     Битовые операции #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
   int short num, mask = 0;
   int sz;
   ...
   sz = sizeof(num)*8;
 
   if (num&2)
      mask |= 1;
   for (int i = 1; i < sz; i++)
   {
      if ((num&(1<<i)) == 0 && (num&(5<<(i-1))))
         mask |= (1 << i);
   }
   num |= mask;
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
12.05.2011, 15:37     Битовые операции #9
Цитата Сообщение от KupueIIIKo Посмотреть сообщение
~ делает побитовое инвертирование
- унарный минус
все нето!

Данный байт хранится допустим в переменной А; в шестнадцатеричном коде! Вообщем мы его переводим в двоичку! Находим единичку! Соседние биты тоже делаем единицами!
Пардон, пропустил слово "рядом".
Но переводить ничего не надо, если число не в виде строки.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.05.2011, 03:09     Битовые операции #10
Цитата Сообщение от KupueIIIKo
Я получаю в переменную "a" значение например "0x3A" = "00111010"
я бы делал тогда символьный массив, но хранил бы там числа
C
1
2
    char n[100] = { 0, 0, 1, 1, 1, 0, 1, 0 };
    int nsize = 8;
в него можно записать произвольное количество бит в таком виде, и для него можно разработать функции совсем не запутанные
resource2008
 Аватар для resource2008
109 / 109 / 2
Регистрация: 11.03.2011
Сообщений: 421
13.05.2011, 03:30     Битовые операции #11
под микроконтроллер лучше наверное писать на асм-е.
KupueIIIKo
2 / 2 / 0
Регистрация: 15.09.2010
Сообщений: 127
13.05.2011, 08:16  [ТС]     Битовые операции #12
ну а байт как ты загонишь в массив?

на асме писать дело неблагодарное )
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
13.05.2011, 08:29     Битовые операции #13
Цитата Сообщение от KupueIIIKo Посмотреть сообщение
ну а байт как ты загонишь в массив?
Битовыми полями
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.05.2011, 08:48     Битовые операции #14
Цитата Сообщение от KupueIIIKo
ну а байт как ты загонишь в массив?
в цикле сдвигаешь вправо и берёшь крайний бит (для этого делается отдельная функция, как и для обратного перевода)
в результате ты представляешь набор битов, как массив чисел, с которым можно работать
при этом не нужно тратить время на размышления о том "1) а как бы мне взять только определённые биты 2) а сколько там битов в одном байте 3) а как бы мне откомментировать теперь код, чтобы я потом сам же и разобрался в нём за полминуты"
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
13.05.2011, 09:00     Битовые операции #15
Цитата Сообщение от accept Посмотреть сообщение
в строковое представление ?
тогда можно сделать простой цикл

C
1
2
3
4
5
6
7
8
9
10
    char num[100] = "010010010";
    int len = strlen(num);
 
    for (i = 0; i < len; i++)
        if (num[i] == '1') {
            if (i > 0 && num[i - 1] != '1')
                num[i - 1] = '1';
            if (i + 1 < len && num[i + 1] != '1')
                num[i + 1] = '1';
        }
Это кстати неверно. Следующий элемент делаем единицей num[i + 1] = '1'; и на след.итерации цикла она будет учитываться. Таким образом за первой попавшейся единицей пойдут все. Так что лучше делать временный массив и результат хранить в нём
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.05.2011, 09:19     Битовые операции #16
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char num[100] = "001001100000001"; /* 011111110000011 */
    int len = strlen(num);
    int i;
    
    for (i = 0; i < len; i++)
        if (num[i] == '1') {
            if (i > 0 && num[i - 1] != '1')
                num[i - 1] = '1';
            if (i + 1 < len && num[i + 1] != '1') {
                num[i + 1] = '1'
                i++;
            }
        }
    printf("%s\n", num);
    return 0;
}
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
13.05.2011, 09:22     Битовые операции #17
Ошибка
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.05.2011, 09:32     Битовые операции #18
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
#include <stdio.h>
#include <string.h>
 
void convert_bits(char *s, int len);
 
int main(void)
{
    char nums[][100] =  {
        "001001100000001",
        "001001000100011"
    };
    int nn = sizeof nums / sizeof nums[0];
    int i;
    
    for (i = 0; i < nn; i++) {
        char *p = nums[i];
        printf("%s ", p);
        convert_bits(p, strlen(p));
        printf("%s\n", p);
    }
    return 0;
}
 
void convert_bits(char *s, int len)
{
    int i;
    
    for (i = 0; i < len; i++)
        if (s[i] == '1') {
            if (i > 0 && s[i - 1] != '1')
                s[i - 1] = '1';
            if (i + 1 < len && s[i + 1] != '1') {
                s[i + 1] = '1';
                i++;
            }
        }
}
Код
[guest@localhost tests]$ ./t
001001100000001 011111110000011
001001000100011 011111101110111
[guest@localhost tests]$
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
13.05.2011, 09:41     Битовые операции #19
Ну тож выложу, как вариант
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
47
48
#include <vcl.h>
#include <iostream.h>
#include <math.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
byte BB(WORD A, byte N)
{
 return ((A>>N)&0x01);
}
 
int main()
{
 WORD n;
 cout << "Enter number: ";
 cin >> n;
 byte s[8];
 byte ss[8]={0,};
 int i;
 cout<<"Old binary: ";
 for (i = 7; i >=0; i--)
 {
  s[i]=BB(n,i);
  cout << (int)s[i];
 }
 for (i = 0; i < 8; i++)
 {
  if (s[i])
  {
   if (i==0) {ss[i+1]=1;ss[i]=1;}
   else if (i==7) {ss[i-1]=1;ss[i]=1;}
   else { ss[i-1]=1; ss[i]=1; ss[i+1]=1;}
  }
 }
 WORD nn=0;
 cout << "\nNew binary: ";
 for (i = 7; i >=0; i--)
 {
  cout << (int)ss[i];
  nn+=ss[i]*pow(2,i);
 }
 cout << "\nNew number: " << (int)nn << endl;
 system ("pause");
 return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2011, 09:48     Битовые операции
Еще ссылки по теме:

Битовые операции и операции смещения языка С C++
Битовые операции C++
C++ Битовые операции

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

Или воспользуйтесь поиском по форуму:
KupueIIIKo
2 / 2 / 0
Регистрация: 15.09.2010
Сообщений: 127
13.05.2011, 09:48  [ТС]     Битовые операции #20
еще 1 минус у меня! strlen - у меня нету такой команды )

Добавлено через 52 секунды
Вообщем перехожу на математику сижу считаю как это сделать с помощью цифр! если сделаю отпишусь!

Добавлено через 49 секунд
просто я юзаю winavr он обладает специфическим C
Yandex
Объявления
13.05.2011, 09:48     Битовые операции
Ответ Создать тему
Опции темы

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