В основном вопросы в заголовке. Я смотрю на исходный код MVC 2:
[Flags]
public enum HttpVerbs {
Get = 1 << 0,
Post = 1 << 1,
Put = 1 << 2,
Delete = 1 << 3,
Head = 1 << 4
}
и мне просто любопытно относительно какой двойные покинутые угловые бракеры <<
делает.
Это будет оператор побитового сдвига влево .
Для каждого сдвига влево значение фактически умножается на 2. Так, например, запись value << 3
умножит значение на 8.
На самом деле он перемещает все фактических битов значения осталось одно место. Итак, если у вас есть значение 12 (десятичное), в двоичном виде это 00001100
; сдвиг влево на одно место превратит это в 00011000
, или 24.
Я знаю, что этот ответ в значительной степени решен, но я подумал, что визуализация может кому-то помочь.
[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
}
Это сдвиг битов. В основном это просто перемещение битов влево, добавляя 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
«Битовый сдвиг влево». 1 << 0
означает «взять целочисленное значение 1 и сдвинуть его биты влево на нулевые биты». То есть 00000001
остается без изменений. 1 << 1
означает «взять целочисленное значение 1 и сдвинуть его биты влево на одно место». 00000001
становится 00000010
.
Это оператор левого битового сдвига. Он сдвигает битовый шаблон левого операнда влево на количество двоичных разрядов, указанных в правом операнде.
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)