一、理解什么是位运算

程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),简单来说位运算就是直接对在内存中的二进制数的每位进行运算操作。

二、学习前先了解一下有哪些运算,运算符都怎么使用的,如下图所示。

对于上面的运算符做个基础的认识,接下来我们详细看一下每个运算符到底该怎么使用呢?

三、在讲位运算之前先讲一下进制转换,方便下文讲解位运算。

2进制、8进制、16进制、32进制、64进制等转换成10进制计算方法我得出一个公式:(^表示次方,如:2^2,即2的2次方,8^5即8的5次方)

每位数字转换成10进制时=进制数^(次方)数字索引位(从0开始计算)*数字

计算示例:(注意黑粗体字)

2进制数:10100=2^0*0+2^1*0+2^2*1+2^3*0+2^4*1=0+0+4+0+16=20

8进制数:24=8^0*4+8^1*2=4+16=20

16进制数:0x14(注意0x是用来表示16进制数的意思,不是数字本身的内容)=16^0*4+16^1*1=4+16=20

至于各进制之间的转换,比如:2进制转换成16进制,如果想自己手算,一般都是先转成10进制,然后将数字进行与进制数相除,直到得出余数小于或等于进制数(或0),当然作为程序员的我们,应该使用现有的方法,如下:

Convert.ToString(数字,进制数)

如:Convert.ToString(10,2)=01010,Convert.ToString(10,8)=12 ,Convert.ToString(13,16)=0x0d

       int i10 = ;
int i16 = 0x5A; Console.WriteLine("示例一:"); Console.Write("10进制【66】转成2、8、16进制结果:{0}、{1}、{2}\n",
Convert.ToString(i10, ), Convert.ToString(i10, ), Convert.ToString(i10, )); Console.Write("16进制【0x5A】转成2、8、10进制结果:{0}、{1}、{2}\n",
Convert.ToString(i16, ), Convert.ToString(i16, ), Convert.ToString(i16, )); Console.ReadLine();

输出如下图:

在这里我要另外讲一下,使用上方Convert.ToString(数字,进制数)转换的时候,转二进制时,左边为0时,0会自动去掉,但是有的时候我们又不希望去掉,因此我想到一种方法是补零。

使用 public String PadLeft(int totalWidth, char paddingChar);进行补零,因为我需要的是得到一个八位的二进制数,所以是PadLeft(8, '0')

padleft 返回一个新字符串,该字符串通过在此实例中的字符左侧填充指定的 Unicode 字符来达到指定的总长度,从而使这些字符右对齐

                /// <summary>
/// 将十进制字符串转二进制
/// </summary>
/// <param name="hexString">返回字符串</param>
/// <returns></returns>
public static string HexStringByStr(string hexString)
{
string result = string.Empty;
int d = Convert.ToInt32(hexString);
//十进制转二进制字符串
result = Convert.ToString(d, 2).PadLeft(8, '0');
return result;
}

四、接下来看一下位运算,看一下每一个运算符是怎么使用的

1、位逻辑非运算
位逻辑非运算是单目的,只有一个运算对象。位逻辑非运算按位对运算对象的值进行非运算,即:如果某一位等于0,就将其转变为1;如果某一位等于1,就将其转变为0。
比如,对二进制的10010001进行位逻辑非运算,结果等于01101110,用十进制表示就是:~145等于110;
对二进制的01010101进行位逻辑非运算,结果等于10101010。用十进制表示就是~85等于176。
 
2、位逻辑与运算
位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0,0与0等于0。
比如:10010001(二进制)&11110000等于10010000(二进制)。

        #region 位运算与运算
int a = ; //11的二进制是0000 1011
int b = ; //13的二进制是0000 1101
Console.WriteLine("a 二进制:"+Convert.ToString(a, ).PadLeft(,'')+ " b 二进制:" + Convert.ToString(b, ).PadLeft(,''));
Console.WriteLine("a & b 二进制输出:"+Convert.ToString(a & b,).PadLeft(,'')); //11 & 13的结果就是0000 1001 即结果是9
Console.Read();
#endregion

结果输出:

3、位逻辑或运算
位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1,
0或0等于0。比如10010001(二进制)| 11110000(二进制)等于11110001(二进制)。
       #region 位运算或运算
int a = ;
int b = ;
Console.WriteLine("a 二进制:" + Convert.ToString(a, ).PadLeft(, '') + " b 二进制:" + Convert.ToString(b, ).PadLeft(, ''));
Console.WriteLine("a | b 二进制输出:" + Convert.ToString(a | b, ).PadLeft(, ''));
Console.Read();
#endregion

结果输出:

4、位逻辑异或运算
位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是:1异或1等于0,1异或0等于1,0异或0等于0。即:相同得0,相异得1。
比如:10010001(二进制)^11110000(二进制)等于01100001(二进制)。

        #region 位运算异或运算
int a = ;
int b = ;
Console.WriteLine("a 二进制:" + Convert.ToString(a, ).PadLeft(, '') + " b 二进制:" + Convert.ToString(b, ).PadLeft(, ''));
Console.WriteLine("a ^ b 二进制输出:" + Convert.ToString(a ^ b, ).PadLeft(, ''));
Console.Read();
#endregion

结果输出:

5、位左移运算
位左移运算将整个数按位左移若干位,左移后空出的部分0。
比如:8位的byte型变量
byte a=0x65(即二进制的01100101),将其左移3位:a<<3的结果是0x27(即二进制的00101000)。
#region 位运算左移运算
int a = ;
int b = ;
Console.WriteLine("a 二进制:" + Convert.ToString(a, ).PadLeft(, '') + " b 二进制:" + Convert.ToString(b, ).PadLeft(, ''));
Console.WriteLine("a << 2 二进制输出:" + Convert.ToString(a << , ).PadLeft(, ''));
Console.WriteLine("b << 2 二进制输出:" + Convert.ToString(b << , ).PadLeft(, ''));
Console.Read();
#endregion
 结果输出:
6、位右移运算
 位右移运算将整个数按位右移若干位,右移后空出的部分填0。
比如:8位的byte型变量
Byte a=0x65(既(二进制的01100101))将其右移3位:a>>3的结果是0x0c(二进制00001100)。
#region 位运算右移运算
int a = ;
int b = ;
Console.WriteLine("a 二进制:" + Convert.ToString(a, ).PadLeft(, '') + " b 二进制:" + Convert.ToString(b, ).PadLeft(, ''));
Console.WriteLine("a >> 2 二进制输出:" + Convert.ToString(a >> , ).PadLeft(, ''));
Console.WriteLine("b >> 2 二进制输出:" + Convert.ToString(b >> , ).PadLeft(, ''));
Console.Read();
#endregion

输出结果:

ok,今天关于位运算的讲解就到这里了,有疑问的欢迎指正。

 

最新文章

  1. python3.5学习笔记--一个简单的图片爬虫
  2. Can&#39;t get WebApplicationContext object from ContextRegistry.GetContext(): Resource handler for the &#39;web&#39; protocol is not defined
  3. SharePoint 2013 删除母版页报错“This file may not be moved, deleted, renamed, or otherwise edited”
  4. java dbcp连接池的使用
  5. 为什么我们使用192.168.0.1作为内网ip
  6. bzoj2324营救皮卡丘
  7. Attribute特性验证模型model
  8. android的项目文件介绍
  9. 中文字体在CSS中的表达方式
  10. Hbiernate关联排序问题
  11. php 图片压缩处理
  12. Oracle Rac创建表空间及用户
  13. freemarker自定义标签报错(二)
  14. 浏览器打开aspx文件 ,提示:XML 解析错误:找不到根元素
  15. Oracle直方图的详细解析(转)
  16. 3.纯 CSS 创作一个容器厚条纹边框特效
  17. 在EORow或者VORow中对数据进行重复性校验
  18. java7(3)——增强的catch之自动释放资源
  19. 【TOJ 5065】最长连续子序列(前缀和)
  20. 关于IE的一些hack

热门文章

  1. B - Sequence II (HDU 5147)
  2. VB6实现Excel多工作簿数据合并
  3. java 的ConcurrentHashMap底层数据结构
  4. 二:MySQL的操作
  5. MyBatis延迟加载及缓存
  6. jmeter压测遇到的问题
  7. &lt;SCOI2008&gt;奖励关
  8. jenkins使用(1)
  9. Android开发之《libyuv库的使用》
  10. dTree动态生成树(后台处理,简化前台操作)