zoukankan      html  css  js  c++  java
  • 位运算效率到底有多高,今天算是见识了,我们用C#统计下执行时间,是不是惊呆了!!!∑(゚Д゚ノ)ノ

    十年河东,十年河西,莫欺少年穷

    学无止境,精益求精

    首先先看下常见位运算的解释

    1、先理解原码、反码、补码

      正数的原码、反码、补码都一样。

        举例  10为例。

      关键是负数。

          原码:

          反码:最高位不变,其余的取反得到:1111  1111  1111  1111  1111  1111  1111  0101

          补码:等于反码加1。         1111  1111  1111  1111  1111  1111  1111  0110

    2、位运算

      位运算符:操作数是整数,但是操作负整数时,用的是补码!!!!!

      左移   << :  右边补0

      右移   >>:   左边补0或1,如果原数最高位是1就补1,是0就补0.

      无符号右移   >>> :  左边补0

      按位与  & :二进制对应位置取与  ,同时为1才为1,否则为0

      按位或  | :二进制对应位置取或  ,有一个为1就为1

      按位异或运算 ^ :二进制对应位置取异或  ,两者不同才为1

      按位取反  ~ :二进制对应位置取反  ,原来是1,变为0,原来是0变为1

      说明:位运算符都是机器数直接运算的

    3、C#程序如下

            public static void Main(string[] args)
            {
                //按位或  | :二进制对应位置取或  ,有一个为1就为1
                Stopwatch sw = new Stopwatch();
                sw.Start();
                for (int i = 0; i < 1000000; i++)
                {
                     var d = i | (1000000 - i);
                }
                sw.Stop();
                TimeSpan ts = sw.Elapsed;
                Console.WriteLine("100万次按位或运算,sw总共花费{0}ms.", ts.TotalMilliseconds);
    
                //按位与  & :二进制对应位置取与  ,同时为1才为1,否则为0
                Stopwatch sw2 = new Stopwatch();
                sw2.Start();
                for (int i = 0; i < 1000000; i++)
                {
                    var d = i & (1000000 - i);
                }
                sw2.Stop();
                TimeSpan ts2 = sw2.Elapsed;
                Console.WriteLine("100万次按位与运算,sw总共花费{0}ms.", ts2.TotalMilliseconds);
    
                //按位异或运算 ^ :二进制对应位置取异或  ,两者不同才为1
                Stopwatch sw3 = new Stopwatch();
                sw3.Start();
                for (int i = 0; i < 1000000; i++)
                {
                    var d = i ^ (1000000 - i);
                }
                sw3.Stop();
                TimeSpan ts3 = sw3.Elapsed;
                Console.WriteLine("100万次按位异或运算,sw总共花费{0}ms.", ts3.TotalMilliseconds);
    
                //按位取反  ~ :二进制对应位置取反  ,原来是1,变为0,原来是0变为1
                Stopwatch sw4 = new Stopwatch();
                sw4.Start();
                for (int i = 0; i < 1000000; i++)
                {
                    var d =  ~ i;
                }
                sw4.Stop();
                TimeSpan ts4 = sw4.Elapsed;
                Console.WriteLine("100万次按位取反运算,sw总共花费{0}ms.", ts4.TotalMilliseconds);
    
                Console.ReadLine();
    
            }

    执行结果:

     100万次运算,三毫秒不到,啥概念???

    哈哈,到此为止吧

    补偿一个方法,共将来使用:

    将十进制转为二进制,然后按位取异常信息

        public class BmsErrorCodeHelpercs
        {
            public static string GetBmsErrorCodeCN(int BmsErrorCode)
            {
              return GetBmsCodeCN(BmsErrorCode);
            }
    
            private static string GetBmsCodeCN(int BmsErrorCode)
            {
                string result = string.Empty;
                var es = Convert.ToString(BmsErrorCode, 2).Reverse().ToList();
                for (int i = 0; i < es.Count; i++)
                {
                    if (es[i] == '1')
                    {
                        switch (i)
                        {
                            case 0: result += "放电过温保护 "; break;
                            case 1: result += "放电低温保护 "; break;
                            case 2: result += "总体过压保护 "; break;
                            case 3: result += "总体欠压保护 "; break;
                            case 4: result += "单体过压保护 "; break;
                            case 5: result += "单体欠压保护 "; break;
                            case 6: result += "短路 "; break;
                            case 7: result += "绝缘电阻过低 "; break;
                            case 8: result += "压差过大 "; break;
                            case 9: result += "进水故障 "; break;
                            case 10: result += "充电过温保护 "; break;
                            case 11: result += "充电低温保护 "; break;
                            case 12: result += "充电过流 "; break;
                            case 13: result += "放电过流 "; break;
    
                        }
                    }
                }
                return result;
            }
        }

    @天才卧龙的博客

  • 相关阅读:
    vuejs中使用echart图表
    锚点链接
    如何动态修改网页的标题(title)?
    如何为图片添加热点链接?(map + area)
    cookie
    如何为你的网站添加标志性的图标(头像)呢?
    图片拖拽上传至服务器
    js定时器之setTimeout的使用
    input[type=file]中使用ajaxSubmit来图片上传
    input[type=file]样式更改以及图片上传预览
  • 原文地址:https://www.cnblogs.com/chenwolong/p/15439261.html
Copyright © 2011-2022 走看看