前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# 关于位运算的学习笔记

C# 关于位运算的学习笔记

作者头像
用户7053485
发布2020-03-12 01:11:54
6680
发布2020-03-12 01:11:54
举报
文章被收录于专栏:Kitty的日常笔记Kitty的日常笔记

一、理解什么是位运算

程序中的所有内容在计算机内存中都是以二进制的形式储存的(即: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

代码语言:javascript
复制
       int i10 = 66;
            int i16 = 0x5A;

            Console.WriteLine("示例一:");

            Console.Write("10进制【66】转成2、8、16进制结果:{0}、{1}、{2}\n",
                        Convert.ToString(i10, 2), Convert.ToString(i10, 8), Convert.ToString(i10, 16));

            Console.Write("16进制【0x5A】转成2、8、10进制结果:{0}、{1}、{2}\n",
            Convert.ToString(i16, 2), Convert.ToString(i16, 8), Convert.ToString(i16, 10));

            Console.ReadLine();

输出如下图:

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

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

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

代码语言:javascript
复制
                /// <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(二进制)。

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

结果输出:

3、位逻辑或运算

位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1,

0或0等于0。比如10010001(二进制)| 11110000(二进制)等于11110001(二进制)。

代码语言:javascript
复制
       #region 位运算或运算
            int a = 16; 
            int b = 22; 
            Console.WriteLine("a 二进制:" + Convert.ToString(a, 2).PadLeft(8, '0') + "     b 二进制:" + Convert.ToString(b, 2).PadLeft(8, '0'));
            Console.WriteLine("a | b 二进制输出:" + Convert.ToString(a | b, 2).PadLeft(8, '0')); 
            Console.Read();
            #endregion

结果输出:

4、位逻辑异或运算

位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是:1异或1等于0,1异或0等于1,0异或0等于0。即:相同得0,相异得1。

比如:10010001(二进制)^11110000(二进制)等于01100001(二进制)。

代码语言:javascript
复制
        #region 位运算异或运算
            int a = 16; 
            int b = 22; 
            Console.WriteLine("a 二进制:" + Convert.ToString(a, 2).PadLeft(8, '0') + "     b 二进制:" + Convert.ToString(b, 2).PadLeft(8, '0'));
            Console.WriteLine("a ^ b 二进制输出:" + Convert.ToString(a ^ b, 2).PadLeft(8, '0')); 
            Console.Read();
            #endregion

结果输出:

5、位左移运算

位左移运算将整个数按位左移若干位,左移后空出的部分0。

比如:8位的byte型变量

byte a=0x65(即二进制的01100101),将其左移3位:a<<3的结果是0x27(即二进制的00101000)。

代码语言:javascript
复制
#region 位运算左移运算
            int a = 16; 
            int b = 22; 
            Console.WriteLine("a 二进制:" + Convert.ToString(a, 2).PadLeft(8, '0') + "     b 二进制:" + Convert.ToString(b, 2).PadLeft(8, '0'));
            Console.WriteLine("a << 2 二进制输出:" + Convert.ToString(a << 2, 2).PadLeft(8, '0'));
            Console.WriteLine("b << 2 二进制输出:" + Convert.ToString(b << 2, 2).PadLeft(8, '0'));
            Console.Read();
            #endregion

结果输出:

6、位右移运算

位右移运算将整个数按位右移若干位,右移后空出的部分填0。

比如:8位的byte型变量

Byte a=0x65(既(二进制的01100101))将其右移3位:a>>3的结果是0x0c(二进制00001100)。

代码语言:javascript
复制
#region 位运算右移运算
            int a = 16; 
            int b = 22; 
            Console.WriteLine("a 二进制:" + Convert.ToString(a, 2).PadLeft(8, '0') + "     b 二进制:" + Convert.ToString(b, 2).PadLeft(8, '0'));
            Console.WriteLine("a >> 2 二进制输出:" + Convert.ToString(a >> 2, 2).PadLeft(8, '0'));
            Console.WriteLine("b >> 2 二进制输出:" + Convert.ToString(b >> 2, 2).PadLeft(8, '0'));
            Console.Read();
            #endregion

输出结果:

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、理解什么是位运算
  • 二、学习前先了解一下有哪些运算,运算符都怎么使用的,如下图所示。
  • 三、在讲位运算之前先讲一下进制转换,方便下文讲解位运算。
  • 四、接下来看一下位运算,看一下每一个运算符是怎么使用的
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档