Bio*_*i3c 4 c# hex bit-manipulation
好的,我正在制作一个卡片播放程序,我将卡片值存储为十六进制数字.这是数组:
public int[] originalCards = new int[54]
{
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D,
0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D,
0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D,
0x50, 0x51
};
Run Code Online (Sandbox Code Playgroud)
第一个数字指的是套装(1 =黑桃; 2 =俱乐部; .... 5 = Jokers)第二个数字是卡的编号(1 = ace,5 = 5; 13 = K等).
我想做类似以下的事情:
Pseudocode:
public int ReturnCard(int num)
{
int card = currentDeck[num];
int suit = card.firsthexdigit;
int value = card.secondhexdigit;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不需要一种新方法来处理整数,我只是为了清楚起见而将其包括在内.
有谁知道如何在C#中做到这一点?
编辑:好的,我正在使用其中一个答案中描述的位移.我可以得到第二个数字(西装)就好了,但第一个数字一直保持为'0'.知道为什么吗?
编辑:编辑:好的,现在工作正常.多谢你们.
你不是真正"解析",只是做一些简单的位操作.
int card = currentDeck[num];
int suit = (card & 0xF0) >> 4;
int value = card & 0x0F;
Run Code Online (Sandbox Code Playgroud)
会做你想做的.
这是使用位字段的答案。
struct {
unsigned int suit:4;
unsigned int value:4;
} card = currentDeck[num];
int suit = card.suit;
int value = card.value;
Run Code Online (Sandbox Code Playgroud)
您可能需要添加 int 进行填充,作为第一个或最后一个字段,以正确排列位。位字段通常用于访问硬件,因为硬件寄存器经常将多个标志打包到单个字节中。
顺便说一句,如果您使用位移位,您需要移动十六进制数字的位数。一个十六进制数字包含值 0 - 15 或 0 - F,这需要 4 位而不是 8 位。因此应该使用:
int suit = (card & 0xF0) >> 4;
Run Code Online (Sandbox Code Playgroud)