如何使用位域查找特定指令? (位比较)

时间:2013-12-04 11:28:19

标签: c

我想找到指令类型(16位)。

例如,类型0指令,它最左边的两位是0。

0 0? ? ? ? ? ? ? ? ? ? ? ? ? ? (16位位字段;?不关心)

我想只使用最左边的两位来找到这种0型指令。

我该怎么办? (C语言)

最终,我想找到一条指令(例如0012345678910111或0098765432123456)是0型指令。

抱歉我的英语T_T。

我想要一些像下面的代码(在Java中)

if (instruction.containsBit(type0) == true)

4 个答案:

答案 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。