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

Работа с битами - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
mexmet20
1 / 1 / 0
Регистрация: 15.05.2011
Сообщений: 16
01.06.2011, 09:02     Работа с битами #1
три раза писал но все равно не получается(((
1-)Ввести последовательность из 8 символов. Сравнить 5-й и 6-й биты каждого символа. Если они не равны, то сделать их равными младшему биту, иначе - старшему.
Вывести исходную последовательность, ее восьмеричные коды; преобразованную последовательность и ее восьмеричные коды.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2011, 09:02     Работа с битами
Посмотрите здесь:

C++ Работа с битами
C++ Работа с битами.
Работа с битами. C++
C++ Работа с битами И Работа с символьными данными
Работа с битами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mexmet20
1 / 1 / 0
Регистрация: 15.05.2011
Сообщений: 16
03.06.2011, 09:17  [ТС]     Работа с битами #2
здравствуйте...Я ещё раз хотел спросить эту задачу .тут что у меня не правильного...

задача

Ввести последовательность из 8 символов. Сравнить 5-й и 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 <iostream.h>
 
 
int main()
{
   char mas[8];
   int szOct = sizeof(char)*3;
   int szBin = sizeof(char)*8;
   int bit;
 
   for (int i = 0; i < 8; i++)
   {
      cout << "Enter the symbol: ";
      cin >> mas[i];
   }
   cout << "Source series: ";
   for (int i = 0; i < 8; i++)
   {
      cout << mas[i] << ' ';
   }
   cout << endl << "Octonary view: ";
   for (int i = 0; i < 8; i++)
   {
      for (int j = szOct-1; j >= 0; j--)
         cout << ((mas[i]>>(j*3))&7);
      cout << ' ';
   }
   cout << endl;
   cout << "Converted series: ";
   for (int i = 0; i < 8; i++)
   {
      if (((mas[i]>>5)&1) == ((mas[i]>>6)&1))
      {
         bit = (mas[i]>>(szBin-1))&1;
         mas[i] |= bit << 5;
         mas[i] |= bit << 6;
      }
      else
      {
         bit = mas[i]&1;
         mas[i] |= bit << 5;
         mas[i] |= bit << 6;
      }
      cout << mas[i] << ' ';
   }
   cout << endl << "Octonary view: ";
   for (int i = 0; i < 8; i++)
   {
      for (int j = szOct-1; j >= 0; j--)
         cout << ((mas[i]>>(j*3))&7);
      cout << ' ';
   }
   cout << endl;
   system("pause");
   return 0;
}
преподаватель сказал что я вообще то не правильно написал эту програму...

говорят что здесь надо было делать вот так...

например буква а 142 бит то 001100010 здесь 5-той и 6-той не равны ,то сделать их равными младшему биту, иначе - старшему. это значит 6-той бит тут 1 5-той бит 0 то они будут 00 .и если 5-той 1 6-той 0 то тогда они равны 11. и ёще например b по биту равна =001000011 тут 5-той и 6-той равны то тогда вместе них надо писать желтую число если смог обяснять как делать не смогли бы подсказать??


я не русский т.е. вообще то плохо знаю руччкий язык... вот так ..спасибо вам..

Добавлено через 1 час 49 минут
up up up up

Добавлено через 16 секунд
+++++++++++++++++++++

Добавлено через 9 часов 51 минуту
++++++++up up up
denix
 Аватар для denix
63 / 63 / 2
Регистрация: 11.01.2009
Сообщений: 130
03.06.2011, 10:27     Работа с битами #3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define MASK 0x60
#define BIT_5 0x20
#define BIT_6 0x40
 
....
 
      if (((mas[i] & BIT_5) && ((mas[i] & BIT_6))
        bit = mass[i] & 0x01;
      else
        bit = mass[i] & 0x80;
 
      if (bit)
          mas[i] |= MASK;
      else
          mas[i] &= ~MASK;
 
...
Добавлено через 13 минут
mexmet20
1 / 1 / 0
Регистрация: 15.05.2011
Сообщений: 16
03.06.2011, 17:47  [ТС]     Работа с битами #4
Цитата Сообщение от denix Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define MASK 0x60
#define BIT_5 0x20
#define BIT_6 0x40
 
....
 
      if (((mas[i] & BIT_5) && ((mas[i] & BIT_6))
        bit = mass[i] & 0x01;
      else
        bit = mass[i] & 0x80;
 
      if (bit)
          mas[i] |= MASK;
      else
          mas[i] &= ~MASK;
 
...
Добавлено через 13 минут
извините но я ничего не понял по боолще не могли бы писат.
denix
 Аватар для denix
63 / 63 / 2
Регистрация: 11.01.2009
Сообщений: 130
03.06.2011, 18:14     Работа с битами #5
Цитата Сообщение от mexmet20 Посмотреть сообщение
извините но я ничего не понял по боолще не могли бы писат.
устанавливаем маску на 5 и 6 биты, т.е. 0b01100000
C
1
#define MASK 0x60
бит 5, т.е. 0b00100000
C
1
#define BIT_5 0x20
бит 6, т.е. 0b01000000
C
1
#define BIT_6 0x40
проверяем условие, что если пятый и шестой биты установлены, то смотрим чему равен первый бит
C
1
2
      if (((mas[i] & BIT_5) && ((mas[i] & BIT_6))
        bit = mass[i] & 0x01;
иначе, если пятый,шестой биты или один из них не установлен, то смотрим, во что установлен старший бит
C
1
2
      else
        bit = mass[i] & 0x80;
устанавливаем 5 и 6 бит в зависимости от того, установлен был младший ИЛИ старший бит
(т.е. 5 и 6 бит ставим в тоже значение, чему был равен младший ИЛИ старший бит)

C
1
2
      if (bit)
          mas[i] |= MASK;
иначе, сбрасываем
C
1
2
      else
          mas[i] &= ~MASK;
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
03.06.2011, 20:38     Работа с битами #6
А если я проверяю начальное значение, допустим являются ли 2 первых бита единицами, я могу определить через наложение маски или могу проверить попадает ли байт в определенный диапазон, т.е. они все идут по порядку. В википедии написано что использование битовой маски неэффективно по производительности... Что будет работать быстрее, наложение маски или проверка числа на вхождение в диапазон?
denix
 Аватар для denix
63 / 63 / 2
Регистрация: 11.01.2009
Сообщений: 130
03.06.2011, 20:50     Работа с битами #7
Цитата Сообщение от Union Посмотреть сообщение
В википедии написано что использование битовой маски неэффективно по производительности...
бред сивой кобылы

Добавлено через 3 минуты
Цитата Сообщение от Union Посмотреть сообщение
Что будет работать быстрее, наложение маски или проверка числа на вхождение в диапазон?
наложение маски - это одна единственная машинная операция.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
04.06.2011, 20:41     Работа с битами #8
Помогите, что-то не получается сообразить как проверить соответствует ли байт маске: 1110xxxx, где хххх - любые биты
как это сделать?
iama
 Аватар для iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
04.06.2011, 20:43     Работа с битами #9
AND с 11100000b, результат должен быть равен 11100000b (для восьмибитных чисел)
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
04.06.2011, 20:48     Работа с битами #10
Ну вот допустим у меня есть такой набор:
1) 11100101
2) 10101010
3) 11101110
4) 11100011
5) 01101001

Маске соответствуют 1, 3 и 4

если я использую AND с 11100000b то в первом случае мне вродеж должно вывести 11111010?
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
04.06.2011, 20:51     Работа с битами #11
как вариант:
C++
1
2
3
4
5
6
    unsigned char val=239; //11101111
 
    int mask=224; //11100000
 
    if ((val&mask)==mask) std::cout << 1;
    else std::cout << 2;
Цитата Сообщение от Union Посмотреть сообщение
если я использую AND с 11100000b то в первом случае мне вродеж должно вывести 11111010?
нет, все остальные биты кроме нужных 3-х (4) обнулятся
iama
 Аватар для iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
04.06.2011, 20:51     Работа с битами #12
AND устанавливает те биты, которые true в обоих числах
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
04.06.2011, 20:53     Работа с битами #13
Поправлю пожалуй.
Цитата Сообщение от iama Посмотреть сообщение
AND с 11100000b, результат должен быть равен 11100000b (для восьмибитных чисел)
AND с 11110000b, результат должен быть равен 11100000b, раз уж левый ноль значим
iama
 Аватар для iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
04.06.2011, 20:55     Работа с битами #14
grizlik78, эээ, а что вы поправили?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
04.06.2011, 20:56     Работа с битами #15
маску
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
04.06.2011, 21:01     Работа с битами #16
Вы меня запутали
Мне нужно проверить соответствует ли первый бит единице, второй единице, третий единице и 4-ый нулю.
Тот пример, что вы привели, проверяет только первые 3 единицы. А мне нужно чтобы и ноль проверяло.
1110xxxx

а всё, что хххх - там не важно нули или единицы
iama
 Аватар для iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
04.06.2011, 21:03     Работа с битами #17
grizlik78, блин, точно, спасибо, двоичная запись - зло
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
04.06.2011, 21:03     Работа с битами #18
да он прав, маска должна быть 11110000

C
1
2
3
4
mask=11110000b;
val = 11110010b;
if ((val&mask)==mask) проходит.
else нет.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
04.06.2011, 21:07     Работа с битами #19
Нет, опять не работает...

Добавлено через 1 минуту
Под данную маску попадают только числа от -17 до -32 включительно
а в вашем последнем примере от -1 до -16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2011, 21:10     Работа с битами
Еще ссылки по теме:

Работа с битами C++
работа с битами C++
Работа с битами C++

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
04.06.2011, 21:10     Работа с битами #20
C
1
2
3
4
5
mask = 11110000b;
expect = 11100000b;
val = 11110010b;
if ((val&mask)==expect) проходит.
else нет.
Yandex
Объявления
04.06.2011, 21:10     Работа с битами
Ответ Создать тему
Опции темы

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