全国质量建设局特种作业网站,psd做成网站,太原网站快速排名提升,百度优化排名1.前言前几天写了两篇关于c#位运算的文章c#位运算基本概念与计算过程C#位运算实际运用在文中也提到了位运算的实际作用之一就是合并整型#xff0c;当时引用了一个问题#xff1a;C# 用两个short#xff0c;一个int32拼成一个long型#xff0c;高16位用short#xff0c;中… 1.前言前几天写了两篇关于c#位运算的文章c#位运算基本概念与计算过程C#位运算实际运用在文中也提到了位运算的实际作用之一就是合并整型当时引用了一个问题C# 用两个short一个int32拼成一个long型高16位用short中间32位用int最低16位用另外一个short。答案如下高16位shortA、中间32位intA、低16位shortBlongResult((long)shortA 48 ) ((long)intA 16) shortB根据longResult获取前16位shortA中间32位intA后16位shortB shortA(short)(longResult48) intA(int)((longResult16)0xFFFFFFFF) shortB(short)(longResult0xFFFF)评论者pushouli、czd890 评论到合并这个long类型的结果是使用加法计算可以使用位逻辑或运算想了想确实使用| 位逻辑或运算也是可以解决问题的能够实现相互转换。 pushouli 用 和 | 在这里性能上应该没有太大区别。 但是感觉用 | 更能表达意思一些longResult(((long)shortA 48) |((long)intA 16)) | (long)shortB1|01、1|11、0|00其计算结果longResult是一样的运算方式不一样其计算过程可以看看前面写的一篇C#位运算实际运用如图这篇文章就将记录两个知识点1.负数的二进制位表示法2.位运算如何直接操作Int类型某一位2.负数的二进制位表示法原码一个整数按照绝对值的大小转换成的二进制数称为原码一个short 16位的整数9的原码是0000 0000 0000 1001反码一个二进制数按位取反所得的二进制数成为原二进制数的反码取9的二进制数的反码可以使用位逻辑非运算 ~取反后的16位二进制1111 1111 1111 0110补码反码加1称为补码简而言之要得到一个属的补码先得到这个数的反码然后再将反码加上1所得数称为补码那么9的补码也就是1111 1111 1111 0110加上1的结果如下1111 1111 1111 0111即-9的16位二进制表示是1111 1111 1111 0111如图3.c#Int有符号的和无符号的区别话不多说直接明确三点结论1.实际开发中都用的是有符号的Int应该默认强制要求只有整型有有无符号的特征Double、Decimal是没有这种特征的。2.无符号数中所有的位都用于直接表示该值的大小。3.有符号数中最高位用于表示正负。这里还是简单地啰嗦几句关于有符号和无符号的区别UInt32和Int32的区别这里说的Int指的是32位有符号的类型Int32的值范围是 -2147483648 至2147483647也就是-2的31次方到2的31次方-1符号位表示的意义就在于此最前面的位表示正负。-2148483648的32位二进制是1000 0000 0000 0000 0000 0000 0000 00002147483647的32位二进制是0111 1111 1111 1111 1111 1111 1111 1111那么c#中UInt32的最大值是什么呢UInt32的范围是0到2的32次方4294967295最大值32位二进制是1111 1111 1111 1111 1111 1111 1111 1111所以得出结论无符号只能表示正数有符号可以表示正负数。如图4.c#Int如何直接操作每一位前面已经说到Int表示的是有符号的最高位表示的正负一个Int有32位虽然我们可以直接操作这32位但是如果直接操作明显会改变数据类型的正负、最大范围。这里写了一个泛型的示例操作整型int、short、long的每一位。 public static IEnumerablebool GetIntOfBitListT(T intVal) { Type intType intVal.GetType();byte bitlength 0;if (intType typeof(Int32)) bitlength 32;else if (intType typeof(Int16)) bitlength 16;else if (intType typeof(Int64)) bitlength 64;elsethrow new ArgumentException(必须是整型);object intOject (object)intVal;var resultList new Listbool(bitlength);for (var i 0; i bitlength; i) {var temoIntBit 1 i;if (intType typeof(Int32)) resultList.Add((((Int32)intOject) temoIntBit) temoIntBit);if (intType typeof(Int16)) resultList.Add((((Int16)intOject) temoIntBit) temoIntBit);if (intType typeof(Int64)) resultList.Add((((Int64)intOject) temoIntBit) temoIntBit); }return resultList; }public static bool GetBitValueT(T intVal,byte index) { Type intType intVal.GetType();byte bitlength 0;if (intType typeof(Int32)) bitlength 32;else if (intType typeof(Int16)) bitlength 16;else if (intType typeof(Int64)) bitlength 64;elsethrow new ArgumentException(必须是整型);if (index bitlength-1 || index 1)throw new ArgumentOutOfRangeException(index);object intOject (object)intVal;var tempBit 1 index;if (intType typeof(Int32))return (((int)intOject) tempBit) tempBit;else if (intType typeof(Int16))return (((Int16)intOject) tempBit) tempBit;elsereturn (((Int64)intOject) tempBit) tempBit; }public static T SetBitValueT(T intVal,byte index,bool bitValue) { Type intType intVal.GetType();byte bitlength 0;if (intType typeof(Int32)) bitlength 32;else if (intType typeof(Int16)) bitlength 16;else if (intType typeof(Int64)) bitlength 64;elsethrow new ArgumentException(必须是整型);if (index bitlength-1 || index 1)throw new ArgumentOutOfRangeException(index);object intOject (object)intVal;var tempBit 1 index;if (intType typeof(Int32)) {int tempInt (int)intOject;return (T)((bitValue ? (tempInt | tempBit) : (tempInt ~tempBit)) as Object); }else if (intType typeof(Int16)) { Int16 tempInt (Int16)intOject;return (T)((bitValue ? (tempInt | tempBit) : (tempInt ~tempBit)) as Object); }else { Int64 tempInt (Int64)intOject;return (T)((bitValue ? (tempInt | tempBit) : (tempInt ~tempBit)) as Object); } }测试截图思考这个方法能操作负数吗原文地址https://www.cnblogs.com/zhangmumu/p/10805312.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com