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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
necheyhin_a_v
3 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 60
#1

Объясните как работают битовые операции C++ - C++

19.12.2012, 18:17. Просмотров 1138. Ответов 17
Метки нет (Все метки)

В книге Айвора Хортона Visual C++ 2005 Базовый курс (ксати очень хорошая книга) была описана такая последовательность побитовой операции ИЛИ(|). Сказано, что она может установить необходимый бит в 1. Это мне понятно, но в одном месте он привел такой пример, который мне не понятен, объясните пожалуйста как работает данная последовательность операторов:
C++
1
2
3
4
int a //хранится какое-либо значение, в котором младшие 2 бита устанавливаем в 1
int b=2; // в двоичном представлении 0000 0010
int c=1; // в двоичном представлении 0000 0001
a |= b>c; //Как отработает в данном случае эта последовательность операторов?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2012, 18:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объясните как работают битовые операции C++ (C++):

битовые операции объясните - C++
функция изменяет старший байт числа на заданное значение не изменяя младший байт и объясните пожалуйста

Битовые операции, битовые поля. - C++
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций. Записать в unsigned int. Использовать...

Как через оператор switch производить битовые операции? - C++
Здравствуйте, В общем несколько вопросов.. Вот к примеру, нужно сделать программу, где надо будет с клавиатуры ввести 2а целых числа...

Битовые операции и операции смещения языка С - C++
Доброго времени суток господа,помогите пожалуйста.Есть 2 кода к задаче,первый работает верно(переводит обычные числа в 16-ти ричные),а...

Как представлять двоичные числа в обратном и дополнительном коде, используя битовые операции? - C++
#include <iostream> #include <string> #include <algorithm> using namespace std; int main() { int n; cout << "Enter...

Битовые операции - C++
Имеется число int x = 85; // 1010101 - двоичное представление // 6543210 - номера битов // нужно взять // 0,2,3,4 биты и сложить...

17
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
19.12.2012, 18:20 #2
не знаю. а неинициализирован. Все биты, включая младший, могут быть чем угодно.
0
Croessmah
Эксперт CЭксперт С++
13415 / 7568 / 855
Регистрация: 27.09.2012
Сообщений: 18,631
Записей в блоге: 3
Завершенные тесты: 1
19.12.2012, 18:22 #3
Цитата Сообщение от necheyhin_a_v Посмотреть сообщение
C++
1
a |= b>c;
точно так написано?
может так:
C++
1
a |= b|c;
1
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
19.12.2012, 18:22 #4
Если b>c то
C++
1
a = a | 1
Иначе
C++
1
a = a | 0
Только a надо чем-то инициализировать сначала.
1
necheyhin_a_v
3 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 60
19.12.2012, 18:35  [ТС] #5
Цитата Сообщение от Schizorb Посмотреть сообщение
Если b>c то
C++
1
a = a | 1
Иначе
C++
1
a = a | 0
Только a надо чем-то инициализировать сначала.
В том то и прикол, что это не условие, т.к. сказано, что оба бита устанавливаются в значение 1, а по вашему только один бит устанавливается либо нулевой, либо первый
0
Croessmah
Эксперт CЭксперт С++
13415 / 7568 / 855
Регистрация: 27.09.2012
Сообщений: 18,631
Записей в блоге: 3
Завершенные тесты: 1
19.12.2012, 18:38 #6
Цитата Сообщение от necheyhin_a_v Посмотреть сообщение
что это не условие, т.к. сказано, что оба бита устанавливаются в значение 1, а по вашему только один бит устанавливается либо нулевой, либо первый
Проверьте сами, сколько бит в данном случае устанавливается
0
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
19.12.2012, 18:39 #7
Я не знаю, что там сказано. Но b>c возвращает значение bool, которое в данной операции будет приводится к int - либо 1 либо 0.
0
necheyhin_a_v
3 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 60
19.12.2012, 18:40  [ТС] #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
не знаю. а неинициализирован. Все биты, включая младший, могут быть чем угодно.
В а хранится что угодно! А два младших бита если они равны 0, то будут установлены в 1, а если равны 1, то ей и останутся, а остальные биты не важны! Так вот почему используется оператор < если условия тут вообще нет! Может опечатка в книге?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
19.12.2012, 18:43 #9
Цитата Сообщение от necheyhin_a_v Посмотреть сообщение
В а хранится что угодно! А два младших бита если они равны 0, то будут установлены в 1, а если равны 1, то ей и останутся, а остальные биты не важны! Так вот почему используется оператор < если условия тут вообще нет! Может опечатка в книге?
если условие ложно, то и младший бит будет чем угодно.
0
necheyhin_a_v
3 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 60
19.12.2012, 18:44  [ТС] #10
Цитата Сообщение от Schizorb Посмотреть сообщение
Я не знаю, что там сказано. Но b>c возвращает значение bool, которое в данной операции будет приводится к in - либо 1 либо 0.

Вы поняли суть побитовой операции ИЛИ?

Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов. (википедия)
Побитовые операции я понял, но только не понял, почему так реализовано! и если используется условие (b>c) тогда только нулевой получается бит будет установлен в 1 (При данных b=2, c=1)
0
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
19.12.2012, 18:46 #11
Цитата Сообщение от necheyhin_a_v Посмотреть сообщение
Может опечатка в книге?
Видимо, да. Правильный вариант по установке двух последних битов предложил Croessmah.
0
necheyhin_a_v
3 / 3 / 1
Регистрация: 18.12.2012
Сообщений: 60
19.12.2012, 18:50  [ТС] #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
если условие ложно, то и младший бит будет чем угодно.
Да! но в книге написано, что два младших бита устанавливаются в значение 1! Наверно все-таки опечатка! Я в этой книге интересную еще опечатку нашел
Приведение типов вместо static_cast<>()
написано в одной главе около 5 раз static_cats<>() - откуда только коты взялись
однако в следующей главе написано без ошибок

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
точно так написано?
может так:
C++
1
a |= b|c;
С вами согласен! Ваш приведенный код правильно вроде написан! Я просто думал, что может я чего не до понимаю!
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.12.2012, 19:01 #13
Цитата Сообщение от necheyhin_a_v Посмотреть сообщение
int a //хранится какое-либо значение, в котором младшие 2 бита устанавливаем в 1
int b=2; // в двоичном представлении 0000 0010
int c=1; // в двоичном представлении 0000 0001
a |= b>c; //Как отработает в данном случае эта последовательность операторов?
Фигня какая то, левый операнд интовый, а правый булевый. Надо так:
C++
1
2
3
4
int a //хранится какое-либо значение, в котором младшие 2 бита устанавливаем в 1
int b=2; // в двоичном представлении 0000 0010
int c=1; // в двоичном представлении 0000 0001
a |= b|c;
. В последней строке сначала вычисляется правый операнд |=, это b|c, в b установлен предпоследний бит, в c последний, значит в результате установятся оба, остальные биты сброшены в обоих операндах, значит сбросятся и в результате, а потом выполнится a|правый опернд оператора |=, результат попадёт в a. Не важно, чему равны остальные биты, где ноли, там ноли в обоих операндах и получаются ноли, где единицы, там в a единицы и в результате будут единицы. Не важно, что в этих позициях во втором операнде, получатся единицы, так как по одной единице в этих позициях уже есть. Так же не важно, чему равны младшие 2 бита a, по одной единице в них уже есть в правом операнде и получатся единицы. Но если поставить и другие единицы в правом операнде, то если в a там ноли, то тогда важно, что в правом операнде, а там мы договорились поставить единицы, ну так они и будут. То есть ноли в этих разрядах поменяются, а менять их не надо при любых исходных значениях.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
19.12.2012, 19:07 #14
Цитата Сообщение от taras atavin Посмотреть сообщение
Фигня какая то, левый операнд интовый, а правый булевый. Надо так:
да кто тебе сказал, что "фигня"? В языке Си нет понятия "булевый".

Добавлено через 58 секунд
Цитата Сообщение от taras atavin Посмотреть сообщение
int a //хранится какое-либо значение, в котором младшие 2 бита устанавливаем в 1
int b=2; // в двоичном представлении 0000 0010
int c=1; // в двоичном представлении 0000 0001
a |= b|c;
Лучше так
C++
1
2
3
4
int a=0; 
int b=2; // в двоичном представлении 0000 0010
int c=1; // в двоичном представлении 0000 0001
a |= b>c;
0
Croessmah
Эксперт CЭксперт С++
13415 / 7568 / 855
Регистрация: 27.09.2012
Сообщений: 18,631
Записей в блоге: 3
Завершенные тесты: 1
19.12.2012, 19:09 #15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Лучше так
так устанавливается только последний бит (хотя кто его знает, что вернет b>c)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2012, 19:09
Привет! Вот еще темы с ответами:

Битовые операции - C++
Добрый день! Помогите пожалуйста написать программу. Дано короткое целое неотрицательное число(2 байта). Выполнить инверсию ...

Битовые операции - C++
Напишите программу в которой обьявите короткое целое со значением 12345 и определите путем выполнения битовых операций С++ установлены...

Битовые операции - C++
Собсно,если используется 4 байтовая переменная,то почему она представлена 16 битами(1010 0110 0010 0110),а не 32 битами?

Битовые операции - C++
Приветствую! Изучаю C++, не могу освоить битовые операции (перемещение, исключающие или, инвертирование всякое). Просто не понимаю...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
19.12.2012, 19:09
Ответ Создать тему
Опции темы

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