Здравствуйте, Пельмешко, Вы писали:
П>"Битовая and" обнуляет биты, кроме не равных 1 соответственно в обоих операндах, никаких "справа от неё".
именно это я имел ввиду
П>Результат можно сравнивать на неравенство 0, а можно чётко проверить какие биты останутся после &, никакой роли в данном случае это не играет, разве что != 0 короче.
зачем и кому это нужно? если СПРАВА от and стоят значения битов 0 и 1, то сравнение со значением только бита 1 ничего не даст
Здравствуйте, <Аноним>, Вы писали:
А> зачем и кому это нужно? если СПРАВА от and стоят значения битов 0 и 1, то сравнение со значением только бита 1 ничего не даст
Делают для однородности конструкций. Чтобы избежать ошибко подобных этой:
[Flags]
enum E
{
One = 1,
Two = 2,
OneAndTwo = 3
}
const E sample = E.One;
// здесь это не имеет значенияbool test = (sample & E.One) != 0;
bool test2 = (sample & E.One) == E.One;
// а здесь имеетbool test3 = (sample & E.OneAndTwo) != 0; // truebool test4 = (sample & E.OneAndTwo) == E.OneAndTwo; // false
А> зачем и кому это нужно? если СПРАВА от and стоят значения битов 0 и 1, то сравнение со значением только бита 1 ничего не даст
там не если — там всегда справа от and стоят значения битов 0 и 1
я не понимаю — вы хотите доказать, что так делать не следует? тогда аргументы в студию.
а бывает всякое. когда например хочется убедится что val именно Dog, а не какойто маммал
Отвечу всем сразу здесь )
Ovl>я не понимаю — вы хотите доказать, что так делать не следует? тогда аргументы в студию.
я хочу сказать, что:
1. это лишнее — лишние символы, лишнии константы (! особенно в случае если там стоят числа); сложнее воспринимаются такие дубли
2. потенциальный источник ошибок в виду таких вот повторов
тогда как сравнение с нулем однозначно говорит о проверки установленности указанных битов
Здравствуйте, Аноним, Вы писали:
А>Отвечу всем сразу здесь )
Ovl>>я не понимаю — вы хотите доказать, что так делать не следует? тогда аргументы в студию. А>я хочу сказать, что: А>1. это лишнее — лишние символы, лишнии константы (! особенно в случае если там стоят числа); сложнее воспринимаются такие дубли А>2. потенциальный источник ошибок в виду таких вот повторов
А>тогда как сравнение с нулем однозначно говорит о проверки установленности указанных битов
это говорит о проверки установленности битов. только не указанных, а гарантированно одного из них. возможно даже некоторых. вот и думайте что будет большей ошибой — принять газ за тормоз или наличие основного и вспомогательного тормозов (образно говоря).
1) какие лишние константы? это просто пример. они все могут быть "нужными". что подразумевается под дублями?
2) нераскрыта тема ошибок.
а можно вопрос? зачем многие так делают? они понимают, что это лишнее, и что достаточно сравнивать с нулем, т.к. битовая and обнуляет все биты кроме перечисленных занчений справа от нее?
А>а можно вопрос? зачем многие так делают? они понимают, что это лишнее, и что достаточно сравнивать с нулем, т.к. битовая and обнуляет все биты кроме перечисленных занчений справа от нее?
"Битовая and" обнуляет биты, кроме не равных 1 соответственно в обоих операндах, никаких "справа от неё".
Результат можно сравнивать на неравенство 0, а можно чётко проверить какие биты останутся после &, никакой роли в данном случае это не играет, разве что != 0 короче.
Здравствуйте, Аноним, Вы писали: А> зачем и кому это нужно? если СПРАВА от and стоят значения битов 0 и 1, то сравнение со значением только бита 1 ничего не даст
Не понимаю чего Вас не устраивает У вас есть несколько бит, надо проверить какой-нибудь из них, делаем AND:
public static class EnumHelper
{
public static bool IsFlagSet<T>(this T value, T flag)
where T: struct
{
Debug.Assert(typeof(T).IsEnum);
var underlying = Enum.GetUnderlyingType(typeof(T));
if (underlying == typeof(int))
return IsInt32FlagSet((int)(object)value, (int)(object)flag);
throw new NotSupportedException();
}
static bool IsInt32FlagSet(int value, int flag)
{
return (value & flag) == flag;
}
}