位运算效率到底有多高,今天算是见识了,我们用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;
        }
    }

@天才卧龙的博客

 

posted @ 2021-10-22 15:44  天才卧龙  阅读(342)  评论(0编辑  收藏  举报