c# - 了解移位运算符

标签 c#

我无法理解这个移位运算符(c# 引用):

class MainClass1
{
 static void Main()
    {
        int i = 1;
        long lg = 1;
        Console.WriteLine("0x{0:x}", i << 1);
        Console.WriteLine("0x{0:x}", i << 33);
        Console.WriteLine("0x{0:x}", lg << 33);
    }
}

/*
Output:
0x2
0x2
0x200000000
*/

class MainClass2
{
     static void Main()
     {
         int a = 1000;
         a <<= 4;
         Console.WriteLine(a);
     }
}

/*
Output:
16000
*/

最佳答案

<<是左移运算符;这采用一个值的二进制表示,并将所有位“n”位向左移动(“mod”除外,请参见“1”),用零回填。

>>是右移运算符;这几乎是相反的(向右移动),除了带符号的值(即那些可以为负的)它用 1s 回填负值,否则为零。

1:

移位运算符本质上是“修改”数据的宽度。 int 是 32 位,因此左移 33(在 Int32 中)与左移 1 完全相同。您不会得到全零。 long是 64 位,所以左移 33 给出了不同的答案(原来乘以 2^33)。

2:

每个左移(在数据宽度内)与 x2 相同(对于整数)- 所以 <<4 是 x2x2x2x2 = x16。

这是简单的二进制文件:

0000000001 = 1

<<转到

0000000010 = 2

<<转到

0000000100 = 4

<<转到

0000001000 = 8

关于c# - 了解移位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/460562/

相关文章:

c# - 强制 WPF 应用程序在 Windows 启动时最大化

c# - 如何在 .net 中调用没有 wsdl 的 web 服务

c# - 部分类或 "chained inheritance"

c# - ASP.Net MVC HttpCompileException 尽管我删除了 Windows 更新

c# - DataTable 和 ASP.NET Repeater

c# - 为什么 IObservables 链完全为每个订阅解析?

c# - 在 C# 中,如何从 ExpandoObject 中删除属性?

c# - 在C#中将二进制字符串转换为整数数组

c# - 如何在 Nest 中测试异常?

c# - Prism 实际上为开发人员提供了什么?值得吗?