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

Двоичная обработка данных - C++

Восстановить пароль Регистрация
 
TonyHopkiens
0 / 0 / 0
Регистрация: 26.05.2014
Сообщений: 4
30.06.2015, 19:53     Двоичная обработка данных #1
Есть такая программа по двоичной обработке массива. Я не совсем понимаю, как здесь менять биты местами, к примеру наложением маски (0х00х0хххххххххх) поменять местами 1 и 3 бит с 4 и 6 битами соответственно. Можно даже на примере одного числа, не массива.

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
49
50
51
52
53
54
55
56
# include <stdio.h> 
# include <string.h> 
# include <stdlib.h>
void tobit(int);
  char s[17]={"0000000000000000"};   int b,a1;
main ()
{
 int a[5]={1528,5184,10822,3555,1234},*sum=NULL;   unsigned char j;
  sum=(int*) malloc (2);//выделяем два байта памяти
  if (!sum)
    {printf("no memory");
     exit(0);
    }
  printf("исходный массив \n");
    for (j=0;j<5;j++)
     { printf("%u   ",a[j]);
      *sum=*sum+a[j]; } 
printf("сумма %d\n",*sum);
sum=NULL;
printf("обработка \n");
  for (j=0;j<5;j++)   { a1=a[j];  tobit(a[j]);
  
a1=a[j]&19455;
  b=a[j]>>15;
  b=b<<12;
  
a1=a1|b;
  b=a[j]>>12;
  b=b<<15;
  
a1=a1|b;
  b=a[j]&8192;
  b=b>>3;
  
a1=a1|b;
  b=a[j]&1024;
  b=b<<3;
  
a1=a1|b;
  *sum=*sum+a1;
  tobit(a1);
  } printf("новая сумма %d\n",*sum);
  scanf("d");
  *sum=NULL;
}
void tobit(int a)
{ char i;
  printf("%d  ",a);
  for (i=0;i<16;i++)
   { b=a1&32768;
     if (!b) s[i]='0';
      else s[i]='1';
     a1=a1<<1;
   }
  puts(s);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
30.06.2015, 20:20     Двоичная обработка данных #2
Цитата Сообщение от TonyHopkiens Посмотреть сообщение
к примеру наложением маски (0х00х0хххххххххх) поменять местами 1 и 3 бит с 4 и 6 битами соответственно.
Поясни пример. Мне не понятна связь между маской и номерами бит.
Байт
 Аватар для Байт
13985 / 8816 / 1229
Регистрация: 24.12.2010
Сообщений: 15,972
30.06.2015, 20:21     Двоичная обработка данных #3
C++
1
2
3
4
5
6
7
8
9
10
int GetBit(int a, int k) // Взять k-й бит числа
{
   return a & (1<<k);
}
int SetBit(int a, int k, bool b)  // Установить k-й бит в b
{
   a = a & (~(1<<k));  // Обнуление бита
   if (b) a |= (1<<k);
   return a;
}
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
30.06.2015, 20:36     Двоичная обработка данных #4
Байт, у него же биты представлены в виде строки символов.
Байт
 Аватар для Байт
13985 / 8816 / 1229
Регистрация: 24.12.2010
Сообщений: 15,972
30.06.2015, 20:51     Двоичная обработка данных #5
Цитата Сообщение от castaway Посмотреть сообщение
у него же биты представлены в виде строки символов
Но работает-то он с целыми элементами массива a.
Еще в строке 43 scanf("d') - явная ошибка.
Вообще код путанный и разбирать его - себе дороже.
Я просто показал, как вытащить и установить бит в целом числе, а дальше пусть сам разбирается.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
30.06.2015, 20:53     Двоичная обработка данных #6
Байт, согласен. Не спорю.
TonyHopkiens
0 / 0 / 0
Регистрация: 26.05.2014
Сообщений: 4
30.06.2015, 21:37  [ТС]     Двоичная обработка данных #7
Задание: Для числа целого типа (16 бит) выполнить двоичную обработку с обязательным применением функций:
поменять местами 1 и 3 бит с 4 и 6 битами соответственно.

Но у меня есть только эта программа без всяких пояснений как пример.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2015, 10:24     Двоичная обработка данных
Еще ссылки по теме:

C++ Двоичная система счисления!
C++ двоичная система счисления
Двоичная(бинарная) сортировка C++

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

Или воспользуйтесь поиском по форуму:
Геомеханик
 Аватар для Геомеханик
517 / 324 / 253
Регистрация: 26.06.2015
Сообщений: 738
01.07.2015, 10:24     Двоичная обработка данных #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//индексация бит с нуля
unsigned short swap_bit(unsigned short n, int i, int j){
    unsigned short a = (n >> i) & 1;
    unsigned short b = (n >> j) & 1;
 
    n &= ~(1 << i);
    n &= ~(1 << j);
    return n | (a << j) | (b << i);
}
 
//...
 
unsigned short n = 0x15;
n = swap_bit(n,  0, 3);
n = swap_bit(n,  2, 5);
Yandex
Объявления
01.07.2015, 10:24     Двоичная обработка данных
Ответ Создать тему
Опции темы

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