Что такое тильда (~) в определении enum?

Я всегда удивляюсь, что даже после использования C # все это время мне все еще удается находить вещи, о которых я не знал ...

Я пытался найти в интернете это, но использование «~» в поиске не очень хорошо для меня, и я тоже ничего не нашел в MSDN (не говоря, его там нет)

Я недавно видел этот фрагмент кода, что означает тильда (~)?

/// <summary>
/// Enumerates the ways a customer may purchase goods.
/// </summary>
[Flags]
public enum PurchaseMethod
{   
    All = ~0,
    None =  0,
    Cash =  1,
    Check =  2,
    CreditCard =  4
}

Я был немного удивлен, увидев его, поэтому я попытался скомпилировать его, и это сработало ... но я до сих пор не знаю, что это значит / делает. Любая помощь?

144
задан 20.05.2020, 03:15

6 ответов

~ является унарным оператором поразрядного дополнения до единицы - это зеркально отражает биты своего операнда.

~0 = 0xFFFFFFFF = -1

в дополнительной арифметике two, ~x == -x-1

~ оператор может быть найден на в значительной степени любом языке, который одолжил синтаксис у C, включая Objective-C/C ++/C#/Java/Javascript.

134
ответ дан 20.05.2020, 03:16
  • 1
    That' s прохладный. Я didn' t понимают, что Вы могли сделать это в перечислении. Будет определенно использовать в будущем – Orion Edwards 20.05.2020, 03:16
  • 2
    @Jimmy: Int32. MinValue является 0x80000000. Это имеет только единственный набор битов (не четыре, что F дал бы Вам). – ILMTitan 20.05.2020, 03:17
  • 3
    @Stevo3000: Int32. MinValue является 0xF0000000, который не является ~0 (it' s на самом деле ~Int32. MaxValue) – Jimmy 20.05.2020, 03:17
  • 4
    Все = (неподписанный интервал)-1 == UInt32. MaxValue. Int32. MaxValue не имеет никакой уместности. – Jimmy 20.05.2020, 03:18
  • 5
    Так it' s эквивалент Всех = Int32. MaxValue? Или UInt32. MaxValue? – Joel Mueller 20.05.2020, 03:18

Я думал бы что:

[Flags]
public enum PurchaseMethod
{
    None = 0,
    Cash = 1,
    Check = 2,
    CreditCard = 4,
    All = Cash | Check | CreditCard
 }

было бы немного более ясным.

57
ответ дан 20.05.2020, 03:17
  • 1
    Менять целевое имя так же просто. Нажмите на название проекта, наверху оставленное, затем выберите целевое имя на правой панели, сопровождаемой путем нажатия " Enter". введите на новое имя. – rmaddy 01.03.2020, 18:26
  • 2
    @Paul, that' s довольно сумасшедший. Let' s прекращают использовать; на английском языке, потому что многие люди don' t понимают его использование. Или все те слова они don' t знают. Ничего себе, такой маленький набор операторов, и мы должны немой вниз наш код для людей это don' t знают то, что биты и как управлять ими? – Kurt Koller 20.05.2020, 03:17
  • 3
    Так как некоторые программисты, которые используют C#, еще не могли бы знать что < < средства, мы должны кодировать вокруг этого также для большей ясности? Я думаю нет. – Kurt Koller 20.05.2020, 03:18
  • 4
    Персональное предпочтение в стороне, если значение ~0 было столь же четким OP, как это Вам и мне, он, никогда не ставило бы этот вопрос во-первых. I' m не уверенный, что это говорит о ясности одного подхода по сравнению с другим. – Sean Bright 20.05.2020, 03:18
  • 5
    Я don' t видят как that' s более ясный. Это добавляет или дублирование или неоднозначность: делает " All" средний " точно набор их 3" или " все в этом enum"? если я добавляю новое значение, я должен также добавить его ко Всем? Если я вижу кого-то еще hasn' t добавил новое значение ко Всем, которое является намеренным? ~0 является явным. – Ken 20.05.2020, 03:18
  • 6
    Это, конечно. Единственный хороший эффект унарного состоит в том, что, если кто-то добавляет к перечислению, Все автоволшебно включают его. Однако, преимущество doesn' t перевешивают отсутствие ясности. – ctacke 20.05.2020, 03:19

Это - дополнительный оператор, Вот статья, к которой я часто обращаюсь для побитовых операторов

http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx

, Также MSDN использует его в их статье перечислений, которая демонстрирует, что это использует лучше

http://msdn.microsoft.com/en-us/library/cc138362.aspx

5
ответ дан 20.05.2020, 03:17
  • 1
    @Dukales:..., почему? AFAIK, без ведущей наклонной черты, на которую это указывает родственник путь, wheras ведущая наклонная черта, делает его абсолютным путь w.r.t. корень файловой системы – Rody Oldenhuis 04.12.2012, 13:32
public enum PurchaseMethod
{   
    All = ~0, // all bits of All are 1. the ~ operator just inverts bits
    None =  0,
    Cash =  1,
    Check =  2,
    CreditCard =  4
}

из-за двух дополнений в C#, ~0 == -1, число, где все биты 1 в двоичном представлении.

22
ответ дан 20.05.2020, 03:18
  • 1
    c# использует два дополнения для представления отрицательных величин. конечно, ~ не является двумя дополнениями, но просто инвертирует все биты. i' m не уверенный, где Вы получили это от, Beardo – Johannes Schaub - litb 20.05.2020, 03:18
  • 2
    @configurator - that' s не корректный. Те дополняют, простая инверсия битов. – Dave Markle 20.05.2020, 03:19
  • 3
    Нет, two' s дополнение просто инвертирует все биты. – configurator 20.05.2020, 03:19
  • 4
    It' s не two' s дополнение, that' s инвертируют все биты и добавляют один, так, чтобы two' s дополнение 0 все еще 0. ~0 просто инвертирование все биты или one' s дополнение. – Beardo 20.05.2020, 03:20
  • 5
    Похож они создают немного флага для способа оплаты: 000 = Ни один; 001 = Cash; 010 = Проверка; 100 = Кредитная карта; 111 = Все – Dillie-O 20.05.2020, 03:20

Лучше, чем

All = Cash | Check | CreditCard

решение, потому что, если Вы добавляете другой метод позже, скажите:

PayPal = 8 ,

Вы будете уже сделаны с тильдой - все, но иметь для изменения все-строки с другим. Так его менее подверженное ошибкам позже.

отношения

16
ответ дан 20.05.2020, 03:19
  • 1
    В Windows к продвижению POSIX наклонная черта является лишней. – Orient 04.12.2012, 13:30
  • 2
    It' s лучше, если Вы также говорите почему it' s менее подверженный ошибкам. Как: если Вы храните значение в базе данных/двоичном файле и затем добавляете другой флаг к перечислению, it' d быть включенным в ' All' что означает это ' All' будет всегда означать все, и не, пока флаги являются тем же:). – Aidiakapi 20.05.2020, 03:19

Просто примечание стороны, когда Вы используете

All = Cash | Check | CreditCard

, Вы обладаете дополнительным преимуществом, которое Cash | Check | CreditCard оценило бы к All а не к другому значению (-1), который не равен всем в то время как содержащий все значения. Например, если Вы используете три флажка в UI

[] Cash
[] Check
[] CreditCard

и суммируете их значения, и пользователь выбирает их всех, Вы видели бы All в получающемся перечислении.

10
ответ дан 20.05.2020, 03:20
  • 1
    Можно ли уточнить os.geteuid() часть? И можно ли дать пример (примеры), чтобы показать, что и не то же т.е. , x может быть достигнут только с getuid и не geteuid, и , y может только быть достигнут только с geteuid и не getuid? – Santosh Kumar 01.04.2020, 01:27
  • 2
    @Pyritie: Как Ваш комментарий имеет какое-либо отношение к тому, что я сказал? – configurator 20.05.2020, 03:20
  • 3
    О, я говорил о том, что Вы видите в отладчике и с ToString - не об использовании == All. – configurator 20.05.2020, 03:21
  • 4
    как в..., если Вы использовали ~0 для " All" Вы могли сделать что-то как All.HasFlag(Cash | Check | CreditCard), и это оценит к истинному. Было бы обходное решение с тех пор == doesn' t всегда работают с ~0. – Pyritie 20.05.2020, 03:21
  • 5
    That' s, почему Вы используете myEnum.HasFlag() вместо этого: D – Pyritie 20.05.2020, 03:21

Теги

Похожие вопросы