Побитовые операторы C # - PullRequest
2 голосов
/ 15 января 2011

Я просматривал код программирования игры и видел перечисления как:

[Flags]
public enum CollisionCategories
{
    Cat1 = (1 << 0),
    Cat2 = (1 << 1),
    Cat3 = (1 << 2),
    Cat4 = (1 << 3),
    ...
}

Теперь, разве это не то же самое, что просто установить каждый элемент, например, 1, 2, 4, 8, ...? Я видел позже также. Я знаю, что делать что-то вроде string s = string.Empty лучше, чем string s = "" в плане производительности, но не уверен насчет перечисления.

Есть мысли?

Большое спасибо,

David

Ответы [ 7 ]

3 голосов
/ 15 января 2011

Вы правы относительно значений, которые хранятся.Это не повлияет на производительность, поэтому это проблема читабельности, которая может иметь больше смысла в контексте кода.

1 голос
/ 15 января 2011

Для некоторых людей установка их таким способом просто чище, чем обычная инициализация шестнадцатеричного / десятичного числа в C raw. (0x1,0x4000 и т. Д.) Поскольку компилятор распознает литерал и превращает их в простые числа, недостатка в производительности нет, это просто вопрос стиля.

1 голос
/ 15 января 2011

Просто проще, когда вы добираетесь до больших чисел.

Я уверен, что (1 << 24) проще, чем идти в калькулятор, вычислять его и вставлять. </p>

0 голосов
/ 15 января 2011

Производительность здесь не проблема. Enum компилируется как константа, так что именно компилятор выполняет эту работу, следовательно, нет никакой разницы в производительности во время выполнения.

Альтернатива могла использовать мощность, но поскольку это связано с кодом, она не будет работать:

enum MyEnum{
  Val1 = Math.Pow(1,2) // throws compile error
}

Ошибка 1 Назначаемое выражение в 'ConsoleApplication1.Program.MyEnum.Val1' должно быть константа C: \ Users \ Aliostad \ Documents \ Visual студия 2010 \ Projects \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs 130 11 ConsoleApplication1

Значения перечисления должны быть константами.

0 голосов
/ 15 января 2011

Я думаю, что String.Empty эквивалентно "" компилятору, который распознает литерал и преобразует его ..... В любом случае, это то же самое для вас enum, это просто вопрос стиля, а в случае enum этоЯ полагаю, что это на 100% ясно, что это битовые флаги.

Или, возможно, кодировщик не был уверен в своих силах 2 и не мог потрудиться решить их.

0 голосов
/ 15 января 2011

Да, это то же самое. Просто код более читабелен.

0 голосов
/ 15 января 2011

Да, это то же самое.

Я бы лично использовал 1,2,4,8 ... потому что я думаю, что эти цифры настолько хорошо известны, что никто не может неправильно понять, что происходит.

Производительность такая же.Размер кода одинаковый.

...