본문 바로가기
C#

C#에서 WORD, DWORD와 비트 연산을 처리하는 방법

by 공부봇 2024. 12. 31.
반응형

C#에서 WORD, DWORD와 비슷한 개념을 처리하기 위한 방법과, 관련된 매크로를 C# 코드로 변환하는 예제를 제공하겠습니다. C#에서는 #define 매크로를 직접 사용할 수 없지만, 대신 메서드나 표현식으로 대체할 수 있습니다.

1. WORD와 DWORD 데이터 타입

C#에서 WORD는 보통 ushort (2바이트, 16비트)로, DWORD는 uint (4바이트, 32비트)로 사용됩니다.

  • ushort: 16비트 부호 없는 정수
  • uint: 32비트 부호 없는 정수

2. LOWORD와 HIWORD

LOWORD와 HIWORD는 DWORD에서 하위 16비트와 상위 16비트를 추출하는 매크로입니다. 이를 C#에서는 메서드로 변환할 수 있습니다.

LOWORD

public static ushort LOWORD(uint l)
{
    return (ushort)(l & 0xFFFF);
}

HIWORD

public static ushort HIWORD(uint l)
{
    return (ushort)((l >> 16) & 0xFFFF);
}
  • l & 0xFFFF: 하위 16비트를 추출
  • (l >> 16) & 0xFFFF: 상위 16비트를 추출

3. LOBYTE와 HIBYTE

LOBYTE와 HIBYTE는 16비트 값에서 하위 8비트와 상위 8비트를 추출하는 매크로입니다.

LOBYTE

public static byte LOBYTE(ushort w)
{
    return (byte)(w & 0xFF);
}

HIBYTE

public static byte HIBYTE(ushort w)
{
    return (byte)((w >> 8) & 0xFF);
}
  • w & 0xFF: 하위 8비트를 추출
  • (w >> 8) & 0xFF: 상위 8비트를 추출

4. MAKEWORD와 MAKELONG

MAKEWORD와 MAKELONG은 두 개의 작은 단위 값(BYTE 또는 WORD)을 결합하여 더 큰 데이터 타입(WORD 또는 DWORD)을 만드는 매크로입니다.

MAKEWORD

public static ushort MAKEWORD(byte a, byte b)
{
    return (ushort)((b << 8) | a);
}
  • b << 8: b를 8비트 왼쪽으로 이동시켜 상위 8비트로 만들고, a와 결합합니다.

MAKELONG

public static uint MAKELONG(ushort a, ushort b)
{
    return (uint)((b << 16) | a);
}
  • b << 16: b를 16비트 왼쪽으로 이동시켜 상위 16비트로 만들고, a와 결합합니다.

5. 예시 코드

아래는 위에서 정의한 메서드를 사용하는 예시입니다:

using System;

class Program
{
    public static ushort LOWORD(uint l)
    {
        return (ushort)(l & 0xFFFF);
    }

    public static ushort HIWORD(uint l)
    {
        return (ushort)((l >> 16) & 0xFFFF);
    }

    public static byte LOBYTE(ushort w)
    {
        return (byte)(w & 0xFF);
    }

    public static byte HIBYTE(ushort w)
    {
        return (byte)((w >> 8) & 0xFF);
    }

    public static ushort MAKEWORD(byte a, byte b)
    {
        return (ushort)((b << 8) | a);
    }

    public static uint MAKELONG(ushort a, ushort b)
    {
        return (uint)((b << 16) | a);
    }

    static void Main()
    {
        // Example usage
        uint dword = 0xABCD1234;
        ushort low = LOWORD(dword);
        ushort high = HIWORD(dword);

        Console.WriteLine($"LOWORD: {low:X4}");
        Console.WriteLine($"HIWORD: {high:X4}");

        ushort word = 0x1234;
        byte lowByte = LOBYTE(word);
        byte highByte = HIBYTE(word);

        Console.WriteLine($"LOBYTE: {lowByte:X2}");
        Console.WriteLine($"HIBYTE: {highByte:X2}");

        byte a = 0xAB;
        byte b = 0xCD;
        ushort combinedWord = MAKEWORD(a, b);
        Console.WriteLine($"MAKEWORD: {combinedWord:X4}");

        ushort wordA = 0x1234;
        ushort wordB = 0x5678;
        uint combinedLong = MAKELONG(wordA, wordB);
        Console.WriteLine($"MAKELONG: {combinedLong:X8}");
    }
}

출력 예시

LOWORD: 1234
HIWORD: ABCD
LOBYTE: 34
HIBYTE: 12
MAKEWORD: CDAB
MAKELONG: 56781234

결론

C#에서 WORD, DWORD 같은 데이터 타입을 사용할 때는 ushort와 uint를 사용하고, 이를 처리하는 매크로를 메서드로 변환하여 하위 비트, 상위 비트를 추출하거나 두 값을 합치는 작업을 할 수 있습니다. 이렇게 변환한 메서드는 비트 연산을 안전하고 효율적으로 처리할 수 있도록 도와줍니다.

반응형