关于逻辑运算符的通俗理解

  现在基本不跟硬件通讯,软件开发很少有人去理解这些逻辑运算符了,经常会用到一些逻辑运算符,今天整理下,通俗的理解一下各运算符是怎么情况.

先放一下测试代码,这个代码本身没有什么意义,主要是对结果的说明

class Program
    {
        static void Main(string[] args)
        {
            int a = 123, b = 0;
            int result;

            #region 1.逻辑 非(~) 运算

            a = 123;
            result = (byte)~a;
            Console.WriteLine("{0} 非(~) 的运算", a);
            PrintResult(result, a, b);

            #endregion

            #region 2.逻辑 与(&) 运算

            b = 12;

            result = a & b;
            Console.WriteLine("{0} 与(&) {1} 的运算", a, b);
            PrintResult(result, a, b);

            #endregion

            #region 3.逻辑 或(|) 运算

            result = a & b;
            Console.WriteLine("{0} 或(|) {1} 的运算", a, b);
            PrintResult(result, a, b);

            #endregion

            #region 3.逻辑 异或(^) 运算

            result = a ^ b;
            Console.WriteLine("{0}  异或(^) {1} 的运算", a, b);
            PrintResult(result, a, b);

            #endregion

            #region 4.左位移(<<) 运算
            a = 5;
            b = 4;
            result = (byte)(a << b);
            Console.WriteLine("{0} 左移位( << ) {1}", a, b);
            Console.WriteLine("运算结果:\t{0}", result);
            Console.WriteLine("{0}的2进制值为:\t{1}", a, FormatBase2(a));
            Console.WriteLine("{0}的2进制值为:\t{1}", result, FormatBase2(result));

            #endregion

            #region 5.右位移(>>) 运算
            a = 5;
            b = 1;
            result = (byte)(a >> b);
            Console.WriteLine("{0} 右移位( >> ) {1}", a, b);
            Console.WriteLine("运算结果:\t{0}", result);
            Console.WriteLine("{0}的2进制值为:\t{1}", a, FormatBase2(a));
            Console.WriteLine("{0}的2进制值为:\t{1}", result, FormatBase2(result));

            #endregion

            Console.ReadKey();
        }

        static void PrintResult(int result, int a, int b)
        {
            Console.WriteLine("运算结果:\t{0}", result);
            Console.WriteLine("{0}的2进制值为:\t{1}", a, FormatBase2(a));
            if (b > 0)
            {
                Console.WriteLine("{0}的2进制值为:\t{1}", b, FormatBase2(b));
            }
            Console.WriteLine("{0}的2进制值为:\t{1}", result, FormatBase2(result));
            Console.WriteLine();
        }

        static string FormatBase2(int num)
        {
            string r = Convert.ToString(num, 2);
            while (r.Length < 8)
            {
                r = "0" + r;
            }
            return r;
        }
    }

说明一下,关于位的逻辑运算,比如常说的 :1个8位字节,可以理解成8位是一个字节,通常用于硬件的一些权限设置,比如: 11111111,一个字节就可以控制8个权限,确实很省啊.

以下的例子都与这个2进制相关,看到2进制的结果就会明白,原来这些符号的起名是那么直观.

先普及一下计算机基础知识,计算机是只认识0和1; ,我们叫,真和假,或者专业点叫 true和false

1. 非运算 c#运算符号:~ ,windows计算器运算符号: Not

123 非(~) 的运算
  运算结果:       132
  123的2进制值为: 01111011
  132的2进制值为: 10000100

根据上面的结果,清楚的看到,原来"非"的运算,是那么简单,

通俗的讲就是:如果是真(1)的,那么就是假(0),如果是假的(0)那么就是真的(1)

2. 与 运算 c#符号:&,计算器符号:And

  123 与(&) 12 的运算
  运算结果:       8
  123的2进制值为: 01111011
  12的2进制值为:   00001100
  8的2进制值为:     00001000

根据2进制结果来看,

通俗的将:如果 都是"真的(1)"那么才是"真的"否则就是"假的(0)".

3.逻辑 或(|) 运算 ,计算器符号:Or  
   123 或(|) 12 的运算 
  运算结果:       127
  123的2进制值为: 01111011
  12的2进制值为:   00001100
  127的2进制值为: 01111111

通俗解释:如果有一个真的,那么就是真的(1),否则就是假的(0);

4.逻辑 异或(^) 运算 ,计算器符号:Xor  
  123  异或(^) 12 的运算
  运算结果:       119
  123的2进制值为: 01111011
  12的2进制值为:   00001100
  119的2进制值为: 01110111

关于异或的说明,测试参数做了些改动,为了把异或的3种可能都呈现出来.

异或的概念是:相同的为假(0),不同的为真(1); 这个好像这么解释就行了.

5.左位移(<<) 运算 计算器符号:Lsh

5 左移位(<<) 4
    运算结果:       80
    5的2进制值为:    00000101
    80的2进制值为:  01010000

一句话:往右边补4个零

6.右位移(>>) 运算 计算器符号:Rsh

5 右移位( >> ) 1

运算结果:       2
   5的2进制值为:   00000101
   2的2进制值为:   00000010

解释:往左边补4个零

其实看到这些结果,几乎不用解释了,他都是按"位"进行计算的,转换为2进制就非常直观了.

时间: 2024-10-12 02:25:41

关于逻辑运算符的通俗理解的相关文章

通俗理解数据库隔离机制

=========================================== 原文链接: 通俗理解数据库隔离机制   转载请注明出处! =========================================== 在理解数据库隔离机制的时候发现网上很多文章都是千篇一律,解释语言太过于标准书面化,描述的晦涩难懂,因果关系模糊.在这里将自己对隔离机制的理解描述一下,力争做到能够通过浅显的语言描述出来. 数据库隔离机制是对于多线程同时操作数据库而言的.对于单线程操作数据库不存在所谓

分布式理论之一:Paxos算法的通俗理解

维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法. Paxos算法目前在Google的Chubby.MegaStore.Spanner等系统中得到了应用,Hadoop中的ZooKeeper也使用了Paxos算法,在上面的各个系统中,使用的算法与Lamport提出的原始Paxos并不完全一样,这个以后再慢慢分析.本博文的目的是,如何让一个小白在半

Activity生命周期的通俗理解

一般一个Activity有三种状态: 1.在屏幕上是可见的且可操作的,他是活跃或运行状态,负责响应用户操作. 2.失去焦点但仍然可见时,他处于暂停状态.也就是说未被完全遮蔽,所以该Activity仍对用户可见,但是当系统处于繁忙的时候下,有肯会杀死该Activity. 3.完全被另一个Activity覆盖时处于停止状态.也有可能被杀死. Activity生命周期中各方法的调用情况 1.onCreate(Bundle savedStatus):第一次创建时调用,只调用一次. 2.onStart()

SSL服务器认证过程通俗理解!

理解有错误的地方,请高手指正! 1,CA中心,有一套自己的公钥和私钥,服务器用自己的私钥去生成一个自认证的证书 2,CA中心的自认证证书是有公信力的,一般被客户端所熟知,发放到每个客户端! 3,客户端需要将CA中的自认证证书加入信任列表! 4,服务器要加入CA体系,要向CA中心申请,CA中心验证了服务器的资料后,向server发放一个证书(key),里面包含了一个秘钥 5,CA发给server的证书是用CA自己的秘钥和申请者的秘钥(key)加密过的, 6,证书里面包含:申请者的身份信息.申请者公

关于面对对对象之接口的通俗理解

一些人写代码,按照计算机思考的那个模式写,写出来的代码,能实现功能,但是拓展性不好,而有些人写代码,是按照人看世界的那些思路去写,写出来的代码 看起来像那么回事儿,而且也非常的符合逻辑,这是为什么?为什么同样是写代码,为什么写出来的东西会完全不一样了? 最近一直在反思自己写的代码,以前写,都是为了完成某项功能而写,写完了也就完事儿了,可是最近却不是这样了,最近想打问题是,写代码是不是只要在实现功能的层面上就可以了了?后来得出的答案是,代码其实还可以写的更加的灵活多变一点的 那么今天我们就来谈谈关

网络七层协议的通俗理解

OSI七层模式简单通俗理解 这个模型学了好多次,总是记不住.今天又看了一遍,发现用历史推演的角度去看问题会更有逻辑,更好记.本文不一定严谨,可能有错漏,主要是抛砖引玉,帮助记性不好的人.总体来说,OSI模型是从底层往上层发展出来的. 这个模型推出的最开始,是是因为美国人有两台机器之间进行通信的需求. 需求1: 科学家要解决的第一个问题是,两个硬件之间怎么通信.具体就是一台发些比特流,然后另一台能收到. 于是,科学家发明了物理层: 主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介

矢量控制的通俗理解

关于矢量控制,通俗理解是: 1. 先把电机想像成2块飞速旋转磁铁,定子磁铁和转子磁铁.进一步可以引申为定子磁场和转子磁场. 2. 电机的电磁转矩与定子磁场强度.转子磁场强度.2块磁铁之间的夹角的正弦成正比.关于这一点不难理解,两块磁铁对齐的时候(0度,sin0=0;),不存在电磁转矩:两块磁铁相差90度的时候(sin90=1;),电磁转矩达到顶峰:  3. 接下来控制的目标就是: 1)稳定其中的一个旋转磁场的强度(恒定磁场):  2) 控制磁铁之间角度为90度(磁场定向FOC): 3) 控制另一

通俗理解TCP握手次数是三次

理解之后,应该说是至少三次就可以保证可靠传输了. 看到网上一篇帖子http://www.cnblogs.com/TechZi/archive/2011/10/18/2216751.html是这么说的,“我Google该问题答案后发现,网络上对于“三次握手”的过程都有很详细的描述,但对于为什么需要“三次握手”来建立连接却没有很好的答案.只能求助于书本了.”后面有谢希德树和另一本书的解释,其实还是太书面化,不够通俗,但是看到后面引到google论坛看到一个让我非常满意的答案. https://gro

happens-before通俗理解

学习Java并发,到后面总会接触到happens-before偏序关系.初接触玩意儿简直就是不知所云,下面是经过一段时间折腾后个人对此的一点浅薄理解,希望对初接触的人有帮助.如有不正确之处,欢迎指正. synchronized.大部分锁,众所周知的一个功能就是使多个线程互斥/串行的(共享锁允许多个线程同时访问,如读锁)访问临界区,但他们的第二个功能 —— 保证变量的可见性 —— 常被遗忘. 为什么存在可见性问题?简单介绍下.相对于内存,CPU的速度是极高的,如果CPU需要存取数据时都直接与内存打