Что делает две открывающих угловых скобки “<<” означают в C#?

В основном вопросы в заголовке. Я смотрю на исходный код MVC 2:

[Flags]
public enum HttpVerbs {
    Get = 1 << 0,
    Post = 1 << 1,
    Put = 1 << 2,
    Delete = 1 << 3,
    Head = 1 << 4
}

и мне просто любопытно относительно какой двойные покинутые угловые бракеры << делает.

43
задан lancscoder 18 June 2014 в 04:13
поделиться

5 ответов

Это будет оператор побитового сдвига влево .

Для каждого сдвига влево значение фактически умножается на 2. Так, например, запись value << 3 умножит значение на 8.

На самом деле он перемещает все фактических битов значения осталось одно место. Итак, если у вас есть значение 12 (десятичное), в двоичном виде это 00001100 ; сдвиг влево на одно место превратит это в 00011000 , или 24.

61
ответ дан 26 November 2019 в 22:22
поделиться

Я знаю, что этот ответ в значительной степени решен, но я подумал, что визуализация может кому-то помочь.

[Fact] public void Bit_shift_left()
{
    Assert.Equal(Convert.ToInt32("0001", 2), 1 << 0); // 1
    Assert.Equal(Convert.ToInt32("0010", 2), 1 << 1); // 2
    Assert.Equal(Convert.ToInt32("0100", 2), 1 << 2); // 4
    Assert.Equal(Convert.ToInt32("1000", 2), 1 << 3); // 8
}
5
ответ дан 26 November 2019 в 22:22
поделиться

Это сдвиг битов. В основном это просто перемещение битов влево, добавляя 0 справа.

public enum HttpVerbs {
    Get = 1 << 0,    // 00000001 -> 00000001 = 1
    Post = 1 << 1,   // 00000001 -> 00000010 = 2
    Put = 1 << 2,    // 00000001 -> 00000100 = 4
    Delete = 1 << 3, // 00000001 -> 00001000 = 8
    Head = 1 << 4    // 00000001 -> 00010000 = 16
}

Дополнительная информация на http://www.blackwasp.co.uk/CSharpShiftOperators.aspx

15
ответ дан 26 November 2019 в 22:22
поделиться

«Битовый сдвиг влево». 1 << 0 означает «взять целочисленное значение 1 и сдвинуть его биты влево на нулевые биты». То есть 00000001 остается без изменений. 1 << 1 означает «взять целочисленное значение 1 и сдвинуть его биты влево на одно место». 00000001 становится 00000010 .

9
ответ дан 26 November 2019 в 22:22
поделиться

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

Get = 1 << 0, // 1
Post = 1 << 1, // 2
Put = 1 << 2,  // 4
Delete = 1 << 3, // 8
Head = 1 << 4  // 16

Семантически это эквивалентно lOperand * Math.Pow(2, rOperand)

36
ответ дан 26 November 2019 в 22:22
поделиться
Другие вопросы по тегам:

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