powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Битовые операции с типом bool
35 сообщений из 35, показаны все 2 страниц
Битовые операции с типом bool
    #39077959
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, корректно ли общаться с типом bool используя битовые операции, к примеру для модификации флага. Встретил в чужом коде, чувствую что-то не то, но объяснить не могу или зря волнуюсь?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
bool flResult = false;
if( firstCond() ){
   flResult |= true;
}
if( secondCond() ){
   flResult |= true;
}
...


или лучше и надежней
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
bool flResult = false;
if( firstCond() ){
   flResult = true;
}

if( secondCond() ){
   flResult = true;
}
...


если лучше, то почему?
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39077969
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17чувствую что-то не то
Правильно чувствуешь. Ибо бред.
Код: sql
1.
bool flResult = firstCond() | secondCond();


Всё, телемаркет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39077988
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17Подскажите, корректно ли общаться с типом bool используя битовые операции, к примеру для модификации флага.


Некорректно. По стандарту.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39077992
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНекорректно. По стандарту.
Стандарт С++ запрещает неявное приведение буля к целому и обратно?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39077993
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivНекорректно. По стандарту.
Стандарт С++ запрещает неявное приведение буля к целому и обратно?..


Туда -- нет. Обратно -- да.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39077994
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDimitry Sibiryakovпропущено...

Стандарт С++ запрещает неявное приведение буля к целому и обратно?..


Туда -- нет. Обратно -- да.

А, хотя, парни, могу уже и наврать... Что-то я давно не брал в руки шашек...
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078020
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17, замени bool на int. Почувствуй вкус свободы!
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078042
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не путаю, то по стандарту 0 это false, а все остальное true. Тогда |= true равносильно = true. Но true & true может оказаться false, поэтому не стоит битовые операции использовать.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078047
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли не путаю, то по стандарту 0 это false, а все остальное true
путаешь и сильно

bool - не числовой тип
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078050
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bool - презерватив в сях.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078081
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima TЕсли не путаю, то по стандарту 0 это false, а все остальное true
путаешь и сильно

bool - не числовой тип
А какой?
что же тогда компилятор не ругается на битовые операции с ним? как это в асме выражается после компиляции?
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078085
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tчто же тогда компилятор не ругается на битовые операции с ним?
приведение к целому и обратно автоматически делает
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078089
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tкак это в асме выражается после компиляции?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int test1(bool arg){
 return arg;
}

bool test2(int  arg){
 return arg;
}


Код: sql
1.
2.
3.
4.
5.
6.
7.
	movzbl	%cl, %eax
	ret


	testl	%ecx, %ecx
	setne	%al
	ret
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078093
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, в одну строчку плохо будет смотреться. Там несколько проверок датчиков, если все норм., то флаг остается false, не хочу тут спорить о архитектуре и т.д. Немного некомфортно, т.к. приходится проверять себя, правильно ли я понял, что "хотел сказать автор". Как-то битовые для битовых структур, логические для bool. Непривычно. Но если все корректно с точки зрения стандарта, значит кому-то так удобней.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078098
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) В числовом контексте bool неявно приводится к 0 и 1.
2) В булевом контексте число неявно приводится к false (0) и true (остальные значения).
3) Для битовых операций аргументы неявно приводятся к int
4) Это все описано в стандарте С++.

Таки образом битовые операции над bool полностью легальны и их результат точно определен стандартом.
Речь идет только про встроенный тип bool в С++.
В языке С bool это обычно int и там возможны эффекты связанные что int может принимать значения помимо 0 и 1. Хотя обычно никаких проблем и там нет, если всегда гарантировать что в переменных значения только 0 и 1.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078102
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
|=true равносильно =true, но это не равносильно & true. В данном случае если флаг был спрошен в true дальше будет выполняться побитовое или. Я так понял под true & true !=true, вы имеете в виду случай 255+1 если у нас на хранение результата выделяется лишь один байт. Я вас правильно понял? Т.е. в данном случае нам такое не грозит или грозит?
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078104
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17Подскажите, корректно ли общаться с типом bool используя битовые операции, к примеру для модификации флага. Встретил в чужом коде, чувствую что-то не то, но объяснить не могу или зря волнуюсь?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
bool flResult = false;
if( firstCond() ){
   flResult |= true;
}
if( secondCond() ){
   flResult |= true;
}
...


или лучше и надежней
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
bool flResult = false;
if( firstCond() ){
   flResult = true;
}

if( secondCond() ){
   flResult = true;
}
...


если лучше, то почему?
Оба кода абсолютно корректны. Но первый смотрится глуповато. А второй не очень красив. Так лучше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
bool flResult = false;

flResult |= firstCond();
flResult |= secondCond();

if ( flResult  )
{
}


Вот так смотрится странно (похоже на ошибку), но работать будет:

Код: plaintext
1.
2.
3.
if ( firstCond() | secondCond() )
{
}



Но лучше так:

Код: plaintext
1.
2.
3.
if ( firstCond() || secondCond() )
{
}



В вариантах с двумя функциями в одном условии нужно помнить про укороченную форму вычисления логических выражений! Это очень важно. Последние два моих кода идентичны друг другу, но не идентичны моему первому коду!!!
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078106
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky1) В числовом контексте bool неявно приводится к 0 и 1.
2) В булевом контексте число неявно приводится к false (0) и true (остальные значения).
3) Для битовых операций аргументы неявно приводятся к int
4) Это все описано в стандарте С++.

Таки образом битовые операции над bool полностью легальны и их результат точно определен стандартом.
Речь идет только про встроенный тип bool в С++.
В языке С bool это обычно int и там возможны эффекты связанные что int может принимать значения помимо 0 и 1. Хотя обычно никаких проблем и там нет, если всегда гарантировать что в переменных значения только 0 и 1.
Ясно. Поясните пожалуйста, что означает "хотя обычно никаких проблем нет", т.е. есть такие ситуации когда проблемы могут быть? Можете пример привести?
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078107
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,
да так гораздо лучше. Согласен.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078109
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17,

Код: plaintext
1.
2.
3.
typedef int Bool;
Bool x = 2;
if ((x | true) == true) ... // не сработает, а с честным bool - сработает, как и должен
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078111
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и с & еще неприятнее.
Код: plaintext
1.
2.
3.
4.
typedef int Bool;
Bool x = 1;
Bool y = 2;
if (x & y) ..  // false хотя оба true
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078114
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravНо лучше так:

Код: plaintext
1.
2.
3.
if ( firstCond() || secondCond() )
{
}



опасное это дело, хер его знает какие побочные эффекты имеет secondCond(),
мож таймер какой взводит, мож железка из COM -порта читает
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078116
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилpetravНо лучше так:

Код: plaintext
1.
2.
3.
if ( firstCond() || secondCond() )
{
}



опасное это дело, хер его знает какие побочные эффекты имеет secondCond(),
мож таймер какой взводит, мож железка из COM -порта читает
Я написал про укороченную форму вычисления логических выражений.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078117
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyda17,

Код: plaintext
1.
2.
3.
typedef int Bool;
Bool x = 2;
if ((x | true) == true) ... // не сработает, а с честным bool - сработает, как и должен


в данном случае true в скобках как 1 рассматривается? Т.е. я правильно понимаю, (3) == true это будет false?
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078119
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще мне кажется хорошим тоном не пользоваться неявным приведением типов к bool. А писать прямо:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int *firstCond();
int secondCond();
bool thirdCond();

if ( firstCond()==nullptr && secondCond()!=0 && thirdCond() )
{
    // Так понятнее. Вот в C# неявных преобразований в/из bool нет.
}
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078121
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

построчно -как и писал топикстартер - будет нагляднее и удобнее - закомментарить при необходимости или логирование добавить для каждого вызова
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078122
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17Anatoly Moskovskyda17,

Код: plaintext
1.
2.
3.
typedef int Bool;
Bool x = 2;
if ((x | true) == true) ... // не сработает, а с честным bool - сработает, как и должен


в данном случае true в скобках как 1 рассматривается? Т.е. я правильно понимаю, (3) == true это будет false?
Да. int более широкий тип чем bool. Вот bool и приводится к int. Но просто лучше такой код не писать. Это игра с огнём и запутает даже опытного программиста. Анатолий это привёл просто как пример, ИМХО.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078124
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилpetrav,

построчно -как и писал топикстартер - будет нагляднее и удобнее - закомментарить при необходимости или логирование добавить для каждого вызова
Да, наверное. Тем более сегодня у функций нет побочных эффектов, завтра будут. А про построчно — это я писал.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078135
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А собственно говоря зачем вам битовый OR/AND?
Вот если бы битовый XOR я бы понял, т.к. не логического аналога.
А все остальные операции есть (&&,||,!). Поэтому их и используйте.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078241
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
da17Не, в одну строчку плохо будет смотреться. Там несколько проверок датчиков, если все норм., то флаг остается false ...
Если в теле if() всегда только flResult = true то можно просто убрать {}
Код: plaintext
1.
2.
3.
4.
bool flResult = false;
if( firstCond() )   flResult = true;
if( secondCond() )   flResult = true;
...


ИМХУ так код читается лучше.

Есть подознение что |= возникло в результате переделки кода.
flResult изначально был int и содержал битовые флаги
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#define FLAG_FIRST 1
#define FLAG_SECOND 2
...

int flResult = 0;
if( firstCond() )   flResult |= FLAG_FIRST;
if( secondCond() )   flResult |= FLAG_SECOND;
...

Затем от флагов избавились за ненадобностью, а |= забыли на = поправить.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078252
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, код есть результат рефакторинга, автор я так понял позаимствовал прием из ряда библиотек QT где он используется для установки битовых флагов.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078254
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы эти библиотеки активно используем. Просмотрел все вхождения, в контексте bool данную операцию в исходниках библиотек не встретил(не всех конечно)
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078260
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже вспомнил теперь, откуда это пришло, года два назад в библиотеке QT service были ошибки при работе на x64 архитектуре(что-то с размерами sockadd_in), которые разработчики не торопились фиксить. Долго тогда пришлось все это разбирать, а там эта конструкция |= часто где встерчалась в битовом контексте.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078262
da17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, в этом и был вопрос "зачем". Теперь понимаю, что абсолютно не нужно это и вредно.
...
Рейтинг: 0 / 0
Битовые операции с типом bool
    #39078275
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для "нечестного bool" можно создать функцию или макрос
isTrue которая проверяет на не равенство арифметическому 0.
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Битовые операции с типом bool
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]