我想找到指令类型(16位)。
例如,类型0指令,它最左边的两位是0。
0 0? ? ? ? ? ? ? ? ? ? ? ? ? ? (16位位字段;?不关心)
我想只使用最左边的两位来找到这种0型指令。
我该怎么办? (C语言)
最终,我想找到一条指令(例如0012345678910111或0098765432123456)是0型指令。
抱歉我的英语T_T。
我想要一些像下面的代码(在Java中)
if (instruction.containsBit(type0) == true)
答案 0 :(得分:2)
使用&
(按位AND)屏蔽相关位,然后使用==
进行比较:
uint16_t opcode = 0xf001;
if((opcode & 0xc000) == 0)
{
printf("opcode 0x%0x has topmost two bits cleared", opcode);
}
0xc000
常量,在这样的代码中通常称为“掩码”,是二进制的1100 0000 0000 0000
,因此当使用按位AND时,它将导致一个数字为1,其中两个参数都有1。将结果与0进行比较可确保opcode
不在掩码为1的位置具有任何1。
答案 1 :(得分:2)
C中的运算符&
可以执行简单的AND运算。另见here。
然后,您只需要在此运算符的右侧检查要检查的位的位掩码。
#include <stdio.h>
int main (int argc, char **argv){
unsigned short a = 0x7FFF;
unsigned short b = 0x80FF;
if( a & 0x8000 ) printf("a Highest bit set\n");
if( a & 0x4000 ) printf("a Second highest bit set\n");
if( b & 0x8000 ) printf("b Highest bit set\n");
if( b & 0x4000 ) printf("b Second highest bit set\n");
return 0;
}
答案 2 :(得分:0)
#define true ((uint8_t)1)
#define false ((uint8_t)0)
uint8_t IsThisInstructionType0(uint16_t instruction)
{
uint16_t andMask = 0x8000;
if(((instruction & andMAsk) >> 15) == 0)
{
andMask >>= 1;
if( ( ((instruction & andMAsk) << 1) >> 15 ) == 0)
return true;
}
else return false;
}
答案 3 :(得分:0)
这样的事情:
int GetInstructionClass (uint16_t ins)
{
return (ins>>14)&3;
}
此表达式:(ins>>14)&3
的工作方式如下:
首先,ins
具有以下格式:
C C X X X X X X X X X X X X X X
其中C
是构成指令类的位。 X
表示“现在不关心”。
第一个操作>>14
将数字向右移动,使其结束如下:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 C C
请注意,由于我们使用uint16_t
,因此移位操作应从左侧输入0,但由于函数结果为int
,并且int
已签名,我是不确定在进行换档之前是否发生了类型提升。我会说在评估整个表达式之后会进行类型提升。
无论如何,为了确保不会返回不需要的位,我们将屏蔽移位的结果,以便只保留位0和1。面具是:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
即3。
所以最终结果将是一个数字,其中0和1位与原始ins
参数的第14位和第15位相同,给出0,1,2或3(我再说一遍:我假设整个表达式被视为16位数字)。这适用于32位环境中的MinGW,Visual C ++和GCC。