C#获取并设置整数的高位字

Jam*_*add 15 c#

获取和设置整数的高阶部分的有效或语法简单方法是什么?

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#没有函数,因此上述方法比将变量传递给方法/扩展方法更具性能

  • +1 向我展示了一些新东西。现在我有一些新的东西可以滥用。 (3认同)

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.


Har*_*lse 5

我想当你想要 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)