本意 發表於 2019-7-7 22:15:00

C# 位运算及实例计算

<p><span style="color: rgba(45, 148, 222, 1); font-size: 18pt">前言</span>:</p>
<p>&nbsp; &nbsp;平时在实际工作中很少用到这个,虽然都是一些比较基础的东西,但一旦遇到了,又不知所云。刚好最近接触了一些相关这方面的项目,所以也算是对 这些内容重新温习实践了一遍。所以这篇不仅作为个人备忘,也分享给各位重温一遍。</p>
<p>&nbsp; &nbsp;要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作。</p>
<p><span style="color: rgba(45, 148, 222, 1); font-size: 18pt">了解</span>:</p>
<p>&nbsp; &nbsp;在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位</p>
<table style="height: 163px; width: 779px" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="94">
<div align="center">运算符号</div>
</td>
<td width="114">
<div align="center">意义</div>
</td>
<td width="104">
<div align="center">运算对象类型</div>
</td>
<td width="108">
<div align="center">运算结果类型</div>
</td>
<td width="74">
<div align="center">对象数</div>
</td>
<td width="130">
<div align="center">实例</div>
</td>
</tr>
<tr>
<td width="94">
<div align="center">~</div>
</td>
<td width="114">
<div align="center">位逻辑<strong>非</strong>运算</div>
</td>
<td rowspan="6" width="104">
<div align="center">整型,字符型</div>
</td>
<td rowspan="6" width="108">
<div align="center">整型</div>
</td>
<td width="74">
<div align="center">1</div>
</td>
<td width="130">
<div align="center">~a</div>
</td>
</tr>
<tr>
<td width="94">
<div align="center">&amp;</div>
</td>
<td width="114">
<div align="center">位逻辑<strong>与</strong>运算</div>
</td>
<td width="74">
<div align="center">2</div>
</td>
<td width="130">
<div align="center">a &amp; b</div>
</td>
</tr>
<tr>
<td width="94">
<div align="center">|</div>
</td>
<td width="114">
<div align="center">位逻辑<strong>或</strong>运算</div>
</td>
<td width="74">
<div align="center">2</div>
</td>
<td width="130">
<div align="center">a | b</div>
</td>
</tr>
<tr>
<td width="94">
<div align="center">^</div>
</td>
<td width="114">
<div align="center">位逻辑<strong>异或</strong>运算</div>
</td>
<td width="74">
<div align="center">2</div>
</td>
<td width="130">
<div align="center">a ^ b</div>
</td>
</tr>
<tr>
<td width="94">
<div align="center">&lt;&lt;&nbsp;</div>
</td>
<td width="114">
<div align="center">位<strong>左移</strong>运算</div>
</td>
<td width="74">
<div align="center">2</div>
</td>
<td width="130">
<div align="center">a&lt;&lt;4</div>
</td>
</tr>
<tr>
<td width="94">
<div align="center">&gt;&gt;&nbsp;</div>
</td>
<td width="114">
<div align="center">位<strong>右移</strong>运算</div>
</td>
<td width="74">
<div align="center">2</div>
</td>
<td width="130">
<div align="center">a&gt;&gt;2</div>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 14pt"><span style="color: rgba(45, 148, 222, 1); font-size: 18pt">开始</span></span><span style="font-size: 14pt; font-family: 楷体">:</span></p>
<p><span style="font-size: 14pt; font-family: 楷体">一、位逻辑非运算</span></p>
<p>&nbsp; &nbsp;位逻辑非运算是单目的,只有一个运算对象。位逻辑非运算按位对运算对象的值进行非运算。符号为:~</p>
<p>即:如果某一位等于0,就将其转变为1;如果某一位等于1,就将其转变为0</p>
<p>对二进制的10010001进行位逻辑非运算,结果等于01101110</p>
<p>用十进制:~145等于110</p>
<p><span style="font-family: 楷体; font-size: 14pt">二、位逻辑与运算</span></p>
<p>&nbsp; &nbsp;位逻辑与运算将两个运算对象按位进行与运算。符号为&amp;。</p>
<p>运算规则为:1&amp;1=1;0&amp;1=0;0&amp;0=0</p>
<div class="cnblogs_code">
<pre>            <span style="color: rgba(0, 0, 255, 1)">#region</span> 位运算与运算
            <span style="color: rgba(0, 0, 255, 1)">int</span> a = <span style="color: rgba(128, 0, 128, 1)">11</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">11的二进制是0000 1011</span>
            <span style="color: rgba(0, 0, 255, 1)">int</span> b = <span style="color: rgba(128, 0, 128, 1)">13</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">13的二进制是0000 1101</span>
            Console.WriteLine(a &amp; b);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">11 &amp; 13的结果就是0000 1001 即结果是9</span>
<span style="color: rgba(0, 0, 0, 1)">            Console.Read();

            </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span></pre>
</div>
<p><em><span style="font-family: 楷体; font-size: 14pt"><img src="https://img2018.cnblogs.com/blog/1576550/201907/1576550-20190707210442322-636994216.png" alt=""></span></em></p>
<p><span style="font-family: 楷体; font-size: 14pt">三、位逻辑或运算</span></p>
<p>&nbsp; &nbsp;位逻辑或运算将两个运算对象按位进行或运算。符号为 |</p>
<p>运算规则为:1|1=1;1|0=1;0|0=0</p>
<div class="cnblogs_code">
<pre>            <span style="color: rgba(0, 0, 255, 1)">#region</span> 位运算或运算
            <span style="color: rgba(0, 0, 255, 1)">int</span> a = <span style="color: rgba(128, 0, 128, 1)">11</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">11的二进制是0000 1011</span>
            <span style="color: rgba(0, 0, 255, 1)">int</span> b = <span style="color: rgba(128, 0, 128, 1)">13</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">13的二进制是0000 1101</span>
            Console.WriteLine(a | b);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">11 | 13的结果就是0000 1111 即结果是15</span>
<span style="color: rgba(0, 0, 0, 1)">            Console.Read();
            </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span></pre>
</div>
<p><em><span style="font-family: 楷体; font-size: 14pt"><img src="https://img2018.cnblogs.com/blog/1576550/201907/1576550-20190707220522760-732334221.png" alt=""></span></em></p>
<p><em id="__mceDel"><span style="font-family: 楷体; font-size: 14pt">四、位逻辑异或运算</span></em></p>
<p>&nbsp; &nbsp;位逻辑异或运算将两个运算对象按位进行异或运算。符号为<strong>^</strong></p>
<p>运算规则:1^1=0;1^0=1;0^0=0 (相同得0,相异得1)</p>
<div class="cnblogs_code">
<pre>            <span style="color: rgba(0, 0, 255, 1)">#region</span> 位运算异或运算
            <span style="color: rgba(0, 0, 255, 1)">int</span> a = <span style="color: rgba(128, 0, 128, 1)">11</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">11的二进制是0000 1011</span>
            <span style="color: rgba(0, 0, 255, 1)">int</span> b = <span style="color: rgba(128, 0, 128, 1)">13</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">13的二进制是0000 1101</span>
            Console.WriteLine(a ^ b);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">11 ^ 13的结果就是0000 0110 即结果是6</span>
<span style="color: rgba(0, 0, 0, 1)">            Console.Read();
            </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span></pre>
</div>
<p><em><span style="font-family: 楷体; font-size: 14pt"><img src="https://img2018.cnblogs.com/blog/1576550/201907/1576550-20190707220400259-64341124.png" alt=""></span></em></p>
<p><em id="__mceDel"><span style="font-family: 楷体; font-size: 14pt">五、位左移运算</span></em></p>
<p>&nbsp; &nbsp;位左移运算将整个数按位左移若干位,左移后空出的部分0。符号为:&lt;&lt;</p>
<p>运算规则:a&lt;&lt;1 =a乘以2的1次方;a&lt;&lt;2 =a乘以2的2次方;a&lt;&lt;3 =a乘以2的3次方</p>
<div class="cnblogs_code">
<pre>            <span style="color: rgba(0, 0, 255, 1)">#region</span> 位左移运算
            <span style="color: rgba(0, 0, 255, 1)">int</span> a = <span style="color: rgba(128, 0, 128, 1)">11</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">11的二进制是0000 1011</span>
            Console.WriteLine(a &lt;&lt; <span style="color: rgba(128, 0, 128, 1)">2</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">0000 1011 左位移2位的结果就是0010 1100 即结果是44 (11*2^2=44)</span>
<span style="color: rgba(0, 0, 0, 1)">            Console.Read();
            </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span></pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1576550/201907/1576550-20190707212717801-780350843.png" alt=""></p>
<p><em id="__mceDel"><span style="font-family: 楷体; font-size: 14pt">六、位右移运算</span></em></p>
<p>&nbsp; &nbsp;位右移运算将整个数按位右移若干位,右移后空出的部分填0。符号为:&gt;&gt;</p>
<p>运算规则:<em id="__mceDel">a&gt;&gt;1 = a整除2的1次方;</em><em id="__mceDel"><em id="__mceDel">a&gt;&gt;2 = a整除2的2次方;</em></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">a&gt;&gt;3 = a整除2的3次方</em></em></em></p>
<div class="cnblogs_code">
<pre>            <span style="color: rgba(0, 0, 255, 1)">#region</span> 位右移运算
            <span style="color: rgba(0, 0, 255, 1)">int</span> a = <span style="color: rgba(128, 0, 128, 1)">11</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">11的二进制是0000 1011</span>
            Console.WriteLine(a &gt;&gt; <span style="color: rgba(128, 0, 128, 1)">2</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">0000 1011 右位移2位的结果就是0000 0010 即结果是2 (11÷(2^2)=2)</span>
<span style="color: rgba(0, 0, 0, 1)">            Console.Read();
            </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span></pre>
</div>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1576550/201907/1576550-20190707213413246-138125855.png" alt=""></p>
<p><span style="color: rgba(45, 148, 222, 1); font-size: 18pt">总结</span>:</p>
<p>1.位运算,虽然平时很少用到位运算符,但是在某些时候,这些确实能够给我们提供很好的解决方案。</p>
<p>2.在实际应用中,不断的重温基础的知识,加强巩固。毕竟很多时候,只有将基础的知识打牢固,后续才能更好的功能拓展和衍生</p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <div>作者:艾三元</div>
<div>出处:https://www.cnblogs.com/i3yuan/</div>
<div>关注:推荐扫码关注公众号</div>
<img src="https://images.cnblogs.com/cnblogs_com/i3yuan/1381525/o_210326143458wxcode.jpg" style="width: 105px">
    <div>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 </div><br><br>
来源:https://www.cnblogs.com/i3yuan/p/11141016.html
頁: [1]
查看完整版本: C# 位运算及实例计算