С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
 Аватар для Fafle
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136

Поразрядные операции, объясните смысл выражений

09.04.2011, 11:36. Показов 3351. Ответов 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 <iostream>
#include <stdio.h>
using namespace std;
 
int main(int argc, char** argv) {
 
    unsigned x;
    void DisplayBits(unsigned);
    cout<<"Введите положительное целочисленное значение\n";
    cin>>x;
    DisplayBits(x);
}
void DisplayBits(unsigned value){
    unsigned c, displayMask=1<<15;
    cout<<value<<"=";
    for(c=1;c<=32;c++){
        putchar(value & displayMask ? '1':'0');
        value<<=1;
        if(c%16==0)
            putchar(' ');
    }
    cout<<endl;
 
}
Но некоторые моменты абсолютно не понятны
C++
1
2
displayMask=1<<15;//Что обозначает данное выражение?
value<<=1;//Аналогично
Сразу признаюсь что была попытка переделки из проги под 2байта под 4, так что исправьте есть что то не так, пожалуйста
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.04.2011, 11:36
Ответы с готовыми решениями:

поразрядные операции
помогите пожалуйста решить следущую задачу: даны два int-числа: N1 = АBCD и N2 = EFGH, где AB…GH – 16-ричные цифры, ПОп –...

Поразрядные операции
Здравствуйте. Объясните, пожалуйста, есть задача: выполнить поразрядное «или» 0-5 разрядов В и 0-3 разрядов С, сдвинутых вправо на 2...

Поразрядные операции
Запрограммировать изменение четырехбайтного числа (unsigned int) так, чтобы байт последовательно заполнялся сначала единицами, а затем...

5
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
09.04.2011, 14:20
C++
1
value<<=1;
аналогично
C++
1
value = value << 1;
операторы сдвига
1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.04.2011, 14:33
Fafle, вы ведь в той теме про "синтаксис" были, должны были видеть мой комментарий. Кратко повторюсь здесь - сдвиг вправо на один бит эквивалентен делению на 2 (соответственно, сдвиг на 2 бита - делению на 4, на три бита - на 8 и т.д. по степеням двойки), а сдвиг влево на один бит - умножению на 2.
Т.о., 1 << 15 == 2^15.
Соответственно, value << 1 == value * 2.
1
 Аватар для Fafle
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136
09.04.2011, 14:45  [ТС]
Так я нифига и не понял, ну сравнение, ну сдвиг, в книжечках такто все тоже написанно, а вот напрочь это нужно, как это все отрабатывает нифига не понятно, но все равно спасибо...
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
09.04.2011, 14:51
Например, было число 7, в двоичном представлении выглядит так:
00000111
Теперь применили оператор сдвига >>1. Это значит, что двоичную запись сдвинули на один бит вправо (что аналогично целочисленному делению на 2). Получили
00000011 (правая единичка потерялась)
Это соответствует числу 3 в двоичном представлении. Получили 7/2 = 3

Зачем это надо? Операция сдвига выполняется быстрее чем обычное деление/умножение, соответственно ее использовать выгоднее. Правда, это не всегда заметно, но все-таки, при больших входных данных смысл использовать есть.
2
 Аватар для Fafle
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136
09.04.2011, 20:18  [ТС]
Лучший ответ Сообщение было отмечено как решение

Решение

Если всетаки найдутся люди пользующиеся поиском и интересующиеся данным вопросом :)
1.7. Поразрядные операции языка С++

Поразрядные операции состоят из четырех основных операций: отрицание, логическое И, логическое ИЛИ и исключающее ИЛИ. Рассмотрим данные операции по порядку.

При выполнении операции поразрядного отрицания все биты, равные 1, устанавливаются равными 0, а все биты равные нулю, устанавливаются равными 1. Для выполнения данной операции в языке С++ используется символ ‘~’ как показано в следующем примере:

unsigned char var = 153; //двоичная запись 10011001
unsigned char not = ~var; //результат 01100110 (число 102)

В результате переменная not будет содержать число 102. В ходе выполнения операции поразрядного И результирующий бит будет равен 1, если оба бита в соответствующих операндах равны 1, т.е.

10010011 & 00111101 даст результат
00010001.

Для выполнения операции логического И используется символ & следующим образом:

unsigned char var = 153; //двоичная запись 10011001
unsigned char mask = 0x11; // число 00010001 (число 17)
unsigned char res = var & mask; // результат 00010001

или

var &= mask; // то же самое, что и var = var & mask;

В ходе выполнения двоичной операции ИЛИ результирующий бит устанавливается равным 1, если хотя бы один бит соответствующих операндов равен 1. В противном случае, результирующее значение равно 0. Для выполнения данной логической операции используется символ ‘|’ как показано ниже:

unsigned char var = 153; //двоичная запись 10011001
unsigned char mask = 0x11; // число 00010001
unsigned char res = var | mask; // результат 10011001

Также допускается применение такой записи

var |= mask; // то же самое, что и var = var | mask;

Наконец, при операции исключающее ИЛИ результирующий бит устанавливается равным 0, если оба бита соответствующих операндов равны 1, и 1 в противном случае. Для выполнения данной операции в языке С++ используется символ ‘^’:

unsigned char var = 153; //двоичная запись 10011001
unsigned char mask = 0x11; // число 00010001
unsigned char res = var ^ mask; // результат 10001000

или

var ^= mask; // то же самое, что и var = var ^ mask;

Рассмотрим примеры использования логических операций, которые часто применяются на практике. Самой распространенной по использованию является операция логического И. Данная операция обычно используется совместно с так называемыми масками. Под маской понимают битовый шаблон, который служит для выделения тех или иных битов числа, к которому она применяется. Например, если требуется определить, является ли нулевой бит числа установленным в 1 или нет, то для этого задается маска 00000001, которая соответствует числу 1 и выполняется операция поразрядного И:

unsigned char flags = 3; // 00000011
unsigned char mask = 1; // 00000001
if((flag & mask) == 1) printf(“Нулевой бит включен”);
else printf(“Нулевой бит выключен”);

Здесь переменная flags, представленная одним байтом, содержит восемь флаговых битов. Для того чтобы узнать установлен или нет нулевой флаговый бит задается маска со значением 1 и выполняется операция логического И. В результате все биты переменной flags будут равны нулю за исключением нулевого, если он изначально имел значение 1. Таким образом, маска является шаблоном, который как бы накладывается на битовое представление числа, из которого выделяются биты, соответствующие единичным значениям маски. Рассмотренный пример показывает, как одна байтовая переменная flags может содержать восемь флаговых значений и тем самым экономить память ЭВМ.

Следующим примером использования логических операция является возможность включать нужные биты в переменной, оставляя другие без изменений. Для этого используется логическая операция ИЛИ. Допустим, в переменной flags необходимо установить второй бит равным 1. Для этого задается маска в виде переменной mask = 2 (00000010) и реализуется операция логического ИЛИ:

unsigned char flags = 0; // 00000000
unsigned char mask = 2; // 00000010
flags |= mask;

Этот код гарантирует, что второй бит переменной flags будет равен 1 без изменений значений других битов.

Для отключения определенных битов целесообразно использовать две логические операции: логическое И и логическое НЕ. Допустим, требуется отключить второй бит переменной flags. Тогда предыдущий пример запишется следующим образом:

unsigned char flags = 0; // 00000000
unsigned char mask = 2; // 00000010
flags = flags & ~mask;

или

flags &= ~mask;

Работа этих двух операций заключается в следующем. Приоритет операции НЕ выше приоритета операции И, поэтому переменная mask в двоичной записи будет иметь вид 11111101. Применяя операцию логического умножения переменной flags с полученным числом ~mask все биты останутся неизменными, кроме второго, значение которого будет равно нулю.

Наконец, операция исключающее ИЛИ позволяет переключать заданные биты переменных. Идея переключения битов основывается на свойствах операции исключающего ИЛИ: 1^1 = 0, 1^0 = 1, 0^0 = 0 и 0^1 = 1. Анализ данных свойств показывает, что если значение бита маски будет равно 1, то соответствующий бит переменной, к которой она применяется, будет переключен, а если значение бита маски равно 0, то значение бита переменной останется неизменным. Следующий пример демонстрирует работу переключения битов переменной flags.

unsigned char flags = 0; //00000000
unsigned char mask = 2; //00000010
flags ^= mask; //00000010
flags ^= mask; //00000000

Кроме логических операций в языке С++ существуют операции поразрядного смещения битов переменной. Операция смещения битов влево определяется знаком << и смещает биты значения левого операнда на шаг, определенный правым операндом, например, в результате выполнения команды

10001010 << 2;

получится результат 00101000. Здесь каждый бит перемещается влево на две позиции, а появляющиеся новые биты устанавливаются нулевыми. Рассмотрим особенности действия данной операции на следующем примере:

int var = 1;
var = var <<1; //00000010 – значение 2
var <<= 1; //00000100 – значение 4

Можно заметить, что смещение битов переменной на одну позицию влево приводит к операции умножения числа на 2. В общем случае, если выполнить сдвиг битов на n шагов, то получим результат равный умножению переменной 2 в степени n на . Данная операция умножения на число 2 в степени n является более быстрой, чем обычное умножения, рассматриваемое ранее.

Аналогично, при операции смещения вправо >> происходит сдвиг битов переменной на шаг, указанный в правом операнде. Например, сдвиг

00101011 >> 2;

приведет к результату 00001010. Здесь, также как и при сдвиге влево, новые появляющиеся биты устанавливаются равными нулю. В результате выполнения последовательностей операций

int var = 128; //1000000
var = var >> 1; //0100000 – значение 64
var >>= 1; //0010000 – значение 32

значение переменной var каждый раз делится на 2. Поэтому сдвиг var >>= n можно использовать для выполнения операции деления значения переменной на величину 2 в степени n.

Самое адекватное как мне кажется из того что я читал в нете.
6
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.04.2011, 20:18
Помогаю со студенческими работами здесь

поразрядные операции
Народ, помогите пожалуйста решить задачу. Задание на скрине. Заранее спасибо.

Поразрядные операции
Обьясните пожалуйста работу поразрядных операций (&amp;, |, ^, &lt;&lt;, &gt;&gt;, ~). Например, n=n&amp;0177; - обнуляет все биты переменной N, кроме младших...

Поразрядные операции
Есть 16-е число, например N=0xC5D612F7, помогите убрать единицу в старшем бите у C и F, используя поразрядные операции на языке Си. Я даже...

Поразрядные операции
Написать функцию, которая в числе x устанавливает 0 в n бит, находящихся справа от позиции p, остальные биты остаются без изменения.

Поразрядные операции
Помогите пожалуйста доделать программу, :даны два int числа: N1 = ABCD и N2 = EFGH, где AB…GH – 16 – ричные цифры. Образовать long число...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru