十年河东,十年河西,莫欺少年穷
学无止境,精益求精
首先先看下常见位运算的解释
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; } }
@天才卧龙的博客