C# 位运算
在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。
C# 中支持的位操作符号有:
运算符号
|
意义
|
运算对象类型
|
运算结果类型
|
对象数
|
实例
|
~
|
按位取反运算
|
整型,字符型
|
整型
|
1
|
~a
|
&
|
位逻辑与运算
|
2
|
a & b
|
||
|
|
位逻辑或运算
|
2
|
a | b
|
||
^
|
位逻辑异或运算
|
2
|
a ^ b
|
||
<<
|
位左移运算
|
2
|
a<<4
|
||
>>
|
位右移运算
|
2
|
a>>2
|
下面详细介绍每个位运算的操作。
1. 按位取反操作 ~
按位取反操作会将整个变量的所有位都进行取反,包括符号位。
- class Program
- {
- static void Main(string[] args)
- {
- int number = 5;
- number = ~number;
- Console.WriteLine(number);
- int k = -5;
- number = ~k;
- Console.WriteLine(number);
- }
- }
输出为:
-6
4
举例: 在C#中int 类型占4个字节, 5 的二进制码为:
- 0000 0000 0000 0000 0000 0000 0000 0101
按位取反后的二进制码为:
- 1111 1111 1111 1111 1111 1111 1111 1010
这个二进制码对应内存中存储的补码,让这个二进制码减去1,得到表示数字的反码:
- 1111 1111 1111 1111 1111 1111 1111 1001
由这个反码即可获得源码,请注意,最左边的为符号位,在活的原码的时候符号位不取反:
- 1000 0000 0000 0000 0000 0000 0000 0110
这个数在内存中即为 -6。
同样,-5在内存中的原码为:
- 1000 0000 0000 0000 0000 0000 0000 0101
获得反反码为:
- 1111 1111 1111 1111 1111 1111 1111 1010
补码为:
- 1111 1111 1111 1111 1111 1111 1111 1011
这个补码按位取反以后为:
- 0000 0000 0000 0000 0000 0000 0000 0100
在内存中即为 4.
2、位逻辑与运算 &
注意:符号位同样参加按位与操作。
位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0。
比如:10010001(二进制)&11110000等于10010000(二进制)。
- class Program
- {
- static void Main(string[] args)
- {
- int a = 1;
- int b = 2;
- int c = a & b;
- Console.WriteLine(c);
- }
- }
a 为:
- 0000 0000 0000 0000 0000 0000 0000 0001
b 为:
- 0000 0000 0000 0000 0000 0000 0000 0010
按位与以后为:
- 0000 0000 0000 0000 0000 0000 0000 0000
下面举例当符号位参与操作的情况:
- static void Main(string[] args)
- {
- int a = -2147483647;
- int b = 1;
- int c = a & b;
- Console.WriteLine(c);
- }
a:
- <pre class="html" name="code">1000 0000 0000 0000 0000 0000 0000 0001</pre>
- <pre></pre>
- <p>a的原码为:</p>
- <pre class="html" name="code">1111 1111 1111 1111 1111 1111 1111 1111</pre>
- <p><br>
- b的二进制:</p>
- <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0001</pre>
- <p><br>
- 按位与以后还是:</p>
- <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0001</pre>
- <h1 class="html" name="code"><a name="t4"></a><br>
- <br>
- <strong><span>3、</span>位逻辑或运算</strong><span> |</span></h1>
- <p class="html" name="code"><span style="font-size:24px; color:#ff0000">同上,同样包含符号位操作。</span></p>
- <div>位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1,</div>
- <div>0或0等于0。比如10010001(二进制)| 11110000(二进制)等于11110001(二进制)。</div>
- <div> </div>
- <div><pre class="html" name="code"> class Program
- {
- static void Main(string[] args)
- {
- int a = 1;
- int b = 2;
- int c = a | b;
- Console.WriteLine(c);
- }
- }</pre><br>
- <p>a 为:</p>
- <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0001</pre>
- <p><br>
- b 为:</p>
- <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0010</pre>
- <p><br>
- 按位与以后为:</p>
- <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0000</pre>
- <p>a 为:</p>
- <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0001</pre>
- <p><br>
- b 为:</p>
- <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0010</pre>
- <p><br>
- 按位或以后为:</p>
- <pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0011</pre></div>
- <p> </p>
- <h1><a name="t5"></a><strong>4、位逻辑异或运算 ^</strong></h1>
- <p><span style="font-size:24px; color:#ff0000">同上,同样包含符号位操作。</span></p>
- <div>位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是:1异或1等于0,</div>
- <div>1异或0等于1,0异或0等于0。即:相同得0,相异得1。</div>
- <div>比如:10010001(二进制)^11110000(二进制)等于01100001(二进制)。</div>
- <h1><a name="t6"></a> </h1>
- <h1><a name="t7"></a>5、位左移运算 <<</h1>
- <p><span style="font-size:24px; color:#ff0000">同上,同样包含符号位操作。</span></p>
- <div>位左移运算将整个数按位左移若干位,左移后空出的部分0。比如:8位的byte型变量</div>
- <div>byte a=0x65(即二进制的01100101),将其左移3位:a<<3的结果是0x27(即二进制的00101000)。</div>
- <div> </div>
- <div><pre class="html" name="code"> static void Main(string[] args)
- {
- int a = -2147483647;
- a = a << 2;
- Console.WriteLine(a);
- }</pre><br>
- </div>
- <div>a 的二进制:</div>
- <div><pre class="html" name="code"><pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0100
- </pre>
- <pre></pre>
- 左移两位以后,符号位丢失:
- <pre></pre>
- </pre></div>
- <div> </div>
- <div><pre class="html" name="code">0000 0000 0000 0000 0000 0000 0000 0100</pre>即为4.<br>
- </div>
- <div> </div>
- <div> </div>
- <h1><a name="t8"></a>6、位右移运算 >></h1>
- <p> </p>
- <p><span style="font-size:24px; color:#ff0000">同上,同样包含符号位操作。</span></p>
- <div>位右移运算将整个数按位右移若干位,右移后空出的部分填0。比如:8位的byte型变量</div>
- <div>Byte a=0x65(既(二进制的01100101))将其右移3位:a>>3的结果是0x0c(二进制00001100)。</div>
- <p> </p>
- <p> </p>
- <p> </p>
- <p> </p>
- <pre></pre>