Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 1
Регистрация: 02.06.2016
Сообщений: 48
1

"Битовая Маска"

20.07.2016, 12:50. Просмотров 2896. Ответов 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
#include <stdio.h>
 
int main()
{
    unsigned x;
    unsigned displayMask = 1 << 31; //маска
    unsigned c; //счетчик
 
    x = 65000;
 
    printf("%d = ",x);
 
    for (c=1; c<=32; c++){
        putchar(x & displayMask ? '1' : '0');
        x <<= 1;
 
        if (c % 8 == 0)
            putchar(' ');
    }
 
    getchar();
 
 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2016, 12:50
Ответы с готовыми решениями:

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;,...

Битовая операция "ИЛИ" эквивалентна операции сложения для двух целых чисел?
Всем привет. Скажите, пожалуйста, битовая операция &quot;ИЛИ&quot; эквивалентна операции сложения для двух...

Битовая маска
Как в шифровании битовыми перестановками применить маску?

битовая маска
как использовать битовую маску? за пример можно взять выделение k-того разряда из n-разрядного...

5
3168 / 1927 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
20.07.2016, 13:09 2
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
int main()
{  
   unsigned x;
   unsigned displayMask = 1 << 31; // Установить старший 
                                   // 31 бит в единицу               
   unsigned c;
 
   x = 65000;
 
   printf("%d = ",x);
 
   // Для всех 32 разрядов
   for (c = 1; c <= 32; ++c)
   {  
      // Вывести 1 если установлен старший бит X
      // (совпадает с маской), или 0 в противном случае
      putchar(x & displayMask ? '1' : '0');
 
      // Сдвинуть все разряды X на единицу влево, так
      // чтобы очередной (справа) разряд стал старшим (31)
      x <<= 1;
 
      // Вставить пробел после печати очередных 8 бит
      if (!(c % 8))
      {  
         putchar(' ');
      }
   }
}
0
0 / 0 / 1
Регистрация: 02.06.2016
Сообщений: 48
20.07.2016, 13:22  [ТС] 3
gazlan, спасибо большое, нашел один момент, который не понимал - теперь разобрался)))) Но есть еще один момент, у тебя написано "вывести 1 если установленный старший бит X совпадает с маской", т.е если у X будет 0 и у маски будет нуль, то выведется 1? Но вроде как "0 & 0 = 0". Поясни
0
35 / 31 / 20
Регистрация: 26.02.2013
Сообщений: 181
20.07.2016, 13:48 4
Лучший ответ Сообщение было отмечено RomanFlash как решение

Решение

Цитата Сообщение от RomanFlash Посмотреть сообщение
"0 & 0 = 0"
это как раз выполняется всегда,
дело в том что разряды X на каждом шаге цикла смещаются влево на один
C++
1
x <<= 1;
а 1 в маске остается всегда в старшем бите на месте. Таким образом, единицы X попадают на 1 маски и тогда уже 1&1=1. По сути, программа выводит двоичное представление числа.
2
3168 / 1927 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
20.07.2016, 14:05 5
Цитата Сообщение от RomanFlash Посмотреть сообщение
т.е если у X будет 0 и у маски будет нуль, то выведется 1?
Нет, потому что тернарный оператор ?: ( (x & displayMask) ? '1' : '0' ) даст '1' только при совпадении установленных в 1 (& - логическое умножение) битов маски и битов переменной X. И поскольку в маске установлен только один (31-й) бит, то и на совпадение проверяется только соответствующий ему бит переменной X. Иными словами, проверяется не совпадение бит, а их одновременно единичное состояние.
1
0 / 0 / 1
Регистрация: 02.06.2016
Сообщений: 48
20.07.2016, 18:12  [ТС] 6
VADIM290692, спасибо))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.07.2016, 18:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

битовая маска
надо разработать функцию проверки правильности битовой маски. 32-х битная “маска” считается...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов), которые разделяются...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую классы: − воин;...

Не работает маска файлов "\\*.txt"
Не хочет выводить файлы. #include &lt;windows.h&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; using...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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