C#正真实现C++中的数值型位域(非位标志)
2015-04-16 15:28
218 查看
C++中的位域成员有2种用途。一种是存放位标志的,比如下面这种。
C#中可以很方便地用 [Flags] Enum 实现,网上找C#实现位域的都是这种。
还有一种是存放数值的,比如今天碰到一个问答,是下面这样的结构。
原先C++中Mul成员的取值范围是0..3。
假如还用 [Flags] Enum 实现,按位与操作后取值是零散的{0,0x40000000,0x80000000,0xC0000000},用起来不方便。
需要把原先C++自动实现的各种位操作封装到属性中:
输出:
struct flags { unsigned int flag1:1; unsigned int flag2:1; }
C#中可以很方便地用 [Flags] Enum 实现,网上找C#实现位域的都是这种。
还有一种是存放数值的,比如今天碰到一个问答,是下面这样的结构。
struct MWORD { unsigned int m_nBase:30; unsigned int m_nMul:2; }
原先C++中Mul成员的取值范围是0..3。
假如还用 [Flags] Enum 实现,按位与操作后取值是零散的{0,0x40000000,0x80000000,0xC0000000},用起来不方便。
需要把原先C++自动实现的各种位操作封装到属性中:
//C#的控制台工程 using System; using System.Runtime.InteropServices; namespace ConsoleApplication1 { [StructLayout(LayoutKind.Sequential)] public struct MWORD { public uint value; //暴露出来方便调试,最终版应该是private的。 public uint Base { get { return this.value & 0x3FFFFFFF; } set { this.value = (this.value & 0xc0000000) | (value & 0x3FFFFFFF); } } public uint Mul { get { return (this.value >> 30) & 0x00000003; } set { this.value = (this.value & 0x3FFFFFFF) | ((value & 0x00000003)<<30); } } } class Program { static void Main(string[] args) { MWORD v = new MWORD(); Console.WriteLine("SizeOf()={0}",Marshal.SizeOf(v)); v.value = 0xffffffff; Console.WriteLine("value=0x{0:X8}, Base={1}, Mul={2}", v.value, v.Base, v.Mul); v.Base = 0x23456789; Console.WriteLine("value=0x{0:X8}, Base={1}, Mul={2}", v.value, v.Base, v.Mul); v.Mul = 2; Console.WriteLine("value=0x{0:X8}, Base={1}, Mul={2}", v.value, v.Base, v.Mul); Console.ReadLine(); } } }
输出:
SizeOf()=4 value=0xFFFFFFFF, Base=1073741823, Mul=3 value=0xE3456789, Base=591751049, Mul=3 value=0xA3456789, Base=591751049, Mul=2
相关文章推荐
- COM方式实现C++调用C#代码的一些总结
- 这个用C++实现的效果可以用C#或JAVA实现吗
- 1ActiveMQ使用 2ActiveMQC#Client实现 3ActiveMQC++Client实现通讯 4 ActiveMQJavaClient实现
- Unity 之 C# 利用回调函数实现C++匿名函数
- C#的COM事件在C++中触发和响应的实现
- 进程通信之一 使用WM_COPYDATA C++及C#实现
- C#字符串格式化的C++实现
- C/C++实现如下 根据Merge Sort原理, 自己实现的归并排序算法+详细注释+代码(C#,C/C++)
- C#实现C/C++程序的自动批改
- 1_C# 实现VMS客户端——调用C++ SDK
- C++如何实现C#的事件机制
- C#和C/C++指针实现swap交换
- 关于C#中调用C++编写的DLL(非托管的DLL)的实现和问题记录
- (原创)一个和c#中Lazy<T>类似的c++ Lazy<T>类的实现
- 谈谈C++中使用或和与来选择模式标志的实现
- c#中实现c/c++的__Line__和__FILE__功能
- 金融系统中PBOC/EMV的TLV的算法实现(含C++/C#)
- C# 的 客户端 去实现 C++ 的 连连看
- C#和C/C++指针实现swap交换
- 用 C++ 实现 C# 中的 委托/事件 (2-delegate event functor)