Mic*_*uen 27
组:
uint debugValue = 0xDEADBEEF;
// get
var toExtractHigh = debugValue >> 16;
Console.WriteLine("{0:X}", toExtractHigh);
// set
uint toSetHigh = 0xABAD;
debugValue = debugValue & 0x0000FFFF | toSetHigh << 16;
// this would work too:
// debugValue = debugValue & 0xFFFF | toSetHigh << 16;
Console.WriteLine("{0:X}", debugValue);
Run Code Online (Sandbox Code Playgroud)
得到:
DEAD
ABADBEEF
Run Code Online (Sandbox Code Playgroud)
[编辑]
C#非常支持共享相同内存位置和位结构的变量
来源:http://msdn.microsoft.com/en-us/library/acxa5b99(VS.80).aspx
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct TestUnion
{
[FieldOffset(0)]
public uint Number;
[FieldOffset(0)]
public ushort Low;
[FieldOffset(2)]
public ushort High;
}
class MainClass
{
public static void Main(string[] args)
{
var x = new TestUnion { Number = 0xABADF00D };
Console.WriteLine("{0:X} {1:X} {2:X}", x.Number, x.High, x.Low);
x.Low = 0xFACE;
Console.WriteLine("{0:X} {1:X} {2:X}", x.Number, x.High, x.Low);
x.High = 0xDEAD;
Console.WriteLine("{0:X} {1:X} {2:X}", x.Number, x.High, x.Low);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:由于C#没有宏函数,因此上述方法比将变量传递给方法/扩展方法更具性能
Mat*_*ley 21
它与C/C++中的相同:
// get the high order 16 bits
int high = 0x12345678 >> 16; // high = 0x1234
// set the high order 16 bits
high = (high & 0x0000FFFF) + (0x5678 << 16); // high = 0x56781234
Run Code Online (Sandbox Code Playgroud)
编辑:因为我心情很好,你走吧.请记住,不可变类型是不可变的!'set'函数需要分配给某些东西.
public static class ExtensionMethods
{
public int LowWord(this int number)
{ return number & 0x0000FFFF; }
public int LowWord(this int number, int newValue)
{ return (number & 0xFFFF0000) + (newValue & 0x0000FFFF); }
public int HighWord(this int number)
{ return number & 0xFFFF0000; }
public int HighWord(this int number, int newValue)
{ return (number & 0x0000FFFF) + (newValue << 16); }
}
Run Code Online (Sandbox Code Playgroud)
编辑2:再想一想,如果你真的需要这样做而且不想在任何地方使用语法,请使用Michael的解决方案.向他展示新的东西+1.
我想当你想要 Hiword / Hibyte 或 LoWord / Lobyte 时你不想要计算,如果 System.Int32 从地址 100 开始(所以它占据地址 100 到 103),你想要作为 LoWord 开始的两个字节地址 100 和 101,Hiword 是地址 102 和 103。
这可以使用类 BitConverter 来实现。这个类不对位做任何事情,它只使用地址来返回请求的值。
由于 int / long 等类型的大小因平台而异,并且 WORD 和 DWORD 有点混乱,我使用系统类型 System.Int16/Int32/Int64。没有人会在猜测 System.Int32 中的位数时遇到任何问题。
使用 BitConverter,您可以将任何整数转换为从该位置开始的字节数组,并将适当长度的字节数组转换为相应的整数。不需要计算,也没有位会改变,
假设您有一个 System.Int32 X(旧术语中的 DWORD)
LOWORD: System.Int16 y = BitConverter.ToInt16(BitConverter.GetBytes(x), 0);
HIWORD: System.Int16 y = BitConverter.ToInt16(BitConverter.GetBytes(x), 2);
Run Code Online (Sandbox Code Playgroud)
好消息是这适用于所有长度,您不必组合像 LOBYTE 和 HIWORD 这样的函数来获取第三个字节:
HIByte(Hiword(x)) will be like: BitConverter.GetBytes(x)[3]
Run Code Online (Sandbox Code Playgroud)