C# 关于位运算的学习笔记
一、理解什么是位运算
程序中的所有内容在计算机内存中都是以二进制的形式储存的(即: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;
}
四、接下来看一下位运算,看一下每一个运算符是怎么使用的
#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
结果输出:
#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
结果输出:
#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
结果输出:
#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
#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,今天关于位运算的讲解就到这里了,有疑问的欢迎指正。
最新文章
- python3.5学习笔记--一个简单的图片爬虫
- Can&#39;t get WebApplicationContext object from ContextRegistry.GetContext(): Resource handler for the &#39;web&#39; protocol is not defined
- SharePoint 2013 删除母版页报错“This file may not be moved, deleted, renamed, or otherwise edited”
- java dbcp连接池的使用
- 为什么我们使用192.168.0.1作为内网ip
- bzoj2324营救皮卡丘
- Attribute特性验证模型model
- android的项目文件介绍
- 中文字体在CSS中的表达方式
- Hbiernate关联排序问题
- php 图片压缩处理
- Oracle Rac创建表空间及用户
- freemarker自定义标签报错(二)
- 浏览器打开aspx文件 ,提示:XML 解析错误:找不到根元素
- Oracle直方图的详细解析(转)
- 3.纯 CSS 创作一个容器厚条纹边框特效
- 在EORow或者VORow中对数据进行重复性校验
- java7(3)——增强的catch之自动释放资源
- 【TOJ 5065】最长连续子序列(前缀和)
- 关于IE的一些hack