一、理解什么是位运算

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

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

输出如下图:

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

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

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

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

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

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(二进制)。

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

结果输出:

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

结果输出:

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

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

结果输出:

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

输出结果:

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

 

C# 关于位运算的学习笔记的更多相关文章

  1. c#位运算小例子笔记

    关于位运算,网上有挺多好的博客介绍过,我就不多解释了 这里只记录一个小例子,是在理解位运算时候写的,帮助自己加深一下印象,做个笔记mark一下 具体场景 摇骰子游戏 1每个骰子有6个点,1-3为小,4 ...

  2. JavaScript 位运算总结&拾遗

    最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...

  3. 位运算总结&拾遗

    JavaScript 位运算总结&拾遗 最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识 ...

  4. Python学习笔记:第2天while循环 运算符 格式化输出 编码

    目录 1. while循环 continue.break和else语句 2. 格式化输出 3. 运算符 3.1 算数运算 3.2 比较运算符 3.3 赋值运算符 3.4 逻辑运算符 3.5 成员运算符 ...

  5. 对于写Python学习笔记的看法

    学习写笔记是一个不错的学习方法,好些同学在学习Python过程中也会写学习笔记.俗话说好记性不如烂笔头,我很赞同这个说法. 我列举几个学习Python写笔记的好处: 1.Python知识的二度巩固 通 ...

  6. 【LeetCode】位运算 bit manipulation(共32题)

    [78]Subsets 给了一个 distinct 的数组,返回它所有的子集. Example: Input: nums = [,,] Output: [ [], [], [], [,,], [,], ...

  7. 位运算求最值 学习笔记 (待补充QAQ)

    没有什么前言?直接进入正题qwq 俩俩异或 求最值: 建trie树 O(n)枚举每个数找这个数的最值,每次反走就成,还可以剪枝一波(如果在某位已经小于ans显然可以直接return? void Ins ...

  8. C#学习笔记-----C#枚举中的位运算权限分配

    一.基础知识 什么是位运算? 用二进制来计算,1&2:这就是位运算,其实它是将0001与0010做位预算   得到的结果是 0011,也就是3  2.位预算有多少种?(我们就将几种我们权限中会 ...

  9. php学习笔记位运算

    位运算 源码:用二进制表示一个数,这个码就是源码. 比如2====00000000 00000000 0000000 00000010 正数的反码 源码 补码都一样 负数的源码是符号位取反.第一个位  ...

随机推荐

  1. Matlab高级教程_第三篇:Matlab转码C/C++方式(混编)_第二部分

    这一部分通过一些实例来进行转码和调试的讲解: 1. 输入变量.输出变量和过程内变量的内存预分配 函数代码:函数名test function [A,B] = test( mark,num,array ) ...

  2. 监控 Linux 服务器活动的几个命令(watch top ac)

    watch.top 和 ac 命令为我们监视 Linux 服务器上的活动提供了一些十分高效的途径. 为了在获取系统活动时更加轻松,Linux 系统提供了一系列相关的命令.在这篇文章中,我们就一起来看看 ...

  3. 401认证钓鱼demo

    <?php //@b4dboy if(!isset($_SERVER['PHP_AUTH_USER']) && !isset($_SERVER['PHP_AUTH_PW'])) ...

  4. Revit二次开发-获取材质的纹理贴图

    通过IExportContext导出类中的Onmaterial()方法,可以获取到材质相关信息,主要是材质ID,再根据材质ID得到材质对象material,然后通过如下代码获取Asset对象: Ele ...

  5. java高并发之线程池

    Java高并发之线程池详解   线程池优势 在业务场景中, 如果一个对象创建销毁开销比较大, 那么此时建议池化对象进行管理. 例如线程, jdbc连接等等, 在高并发场景中, 如果可以复用之前销毁的对 ...

  6. python学习笔记(22)-os文件操作模块

    疑问: 如果打开操作一个文件,是用绝对路径好还是相对路径好? os模块,在lib下面,可以直接引入的,直接使用import. 一.新建一个目录,新建一个文件夹 import os #新建一个文件夹 o ...

  7. DAG Optimal Coin Change

    题目描述 In a 10-dollar shop, everything is worthy 10 dollars or less. In order to serve customers more ...

  8. php7 安装mongodb扩展

    下载 mongodb-1.6.0.tgz   wget https://pecl.php.net/get/mongodb-1.6.0.tgz  版本太低的话有些语法不一样,起码1.5以上吧 进入 mo ...

  9. Derby 命令

    SHOW [ TABLES | VIEWS | PROCEDURES | FUNCTIONS | SYNONYMS ] { IN sche -- 列出表.视图.过程.函数或同义词 SHOW INDEX ...

  10. 基于Python的Flask基础知识

    Flask简介 Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架.Armin Ronacher带领一个名为Pocco的国际Python爱好者团队开发了Flask. 下面我们简单 ...