Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用位字段查找特定指令?(位比较)_C - Fatal编程技术网

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

C 如何使用位字段查找特定指令?(位比较),c,C,我想找到指令类型(16位) 例如,类型0指令,其最左边的两位总是0 0 0?(16位字段;?不在乎) 我希望仅使用最左边的两位查找此类型0指令 我该怎么办?(C语言) 最后,我想发现一条指令(如0012345678910111或0098765432123456)是类型0指令 对不起,我的英语错了 我想要一些如下的代码(Java) 使用&(按位和)屏蔽相关位,然后==进行比较: uint16_t opcode = 0xf001; if((opcode & 0xc000) == 0) {

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

例如,类型0指令,其最左边的两位总是0

0 0?(16位字段;?不在乎)

我希望仅使用最左边的两位查找此类型0指令

我该怎么办?(C语言)

最后,我想发现一条指令(如0012345678910111或0098765432123456)是类型0指令

对不起,我的英语错了

我想要一些如下的代码(Java)


使用
&
(按位和)屏蔽相关位,然后
==
进行比较:

uint16_t opcode = 0xf001;

if((opcode & 0xc000) == 0)
{
  printf("opcode 0x%0x has topmost two bits cleared", opcode);
}

0xc000
常量,在类似这样的代码中通常称为“掩码”,是二进制的
1100 0000
,因此当与按位AND一起应用时,它将导致一个数有1,其中两个参数都有1。将结果与0进行比较,确保
操作码
在掩码有1的位置没有任何1。

使用
(按位和)屏蔽相关位,然后
=
进行比较:

uint16_t opcode = 0xf001;

if((opcode & 0xc000) == 0)
{
  printf("opcode 0x%0x has topmost two bits cleared", opcode);
}

0xc000
常量,在类似这样的代码中通常称为“掩码”,是二进制的
1100 0000
,因此当与按位AND一起应用时,它将导致一个数有1,其中两个参数都有1。将结果与0进行比较,确保
操作码
在掩码有1s的位置没有任何1s。

C中的操作员
&
可以执行简单的AND操作。另见。 然后,您只需要在该运算符的右侧显示要检查的位的位掩码

#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;
}
#包括
int main(int argc,字符**argv){
无符号短a=0x7FFF;
无符号短b=0x80FF;
如果(a&0x8000)printf(“最高位集\n”);
if(a&0x4000)printf(“第二高位集\n”);
if(b&0x8000)printf(“b最高位集\n”);
if(b&0x4000)printf(“b第二高位集\n”);
返回0;
}

C语言中的操作员
&
可以执行简单而简单的操作。另见。 然后,您只需要在该运算符的右侧显示要检查的位的位掩码

#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;
}
#包括
int main(int argc,字符**argv){
无符号短a=0x7FFF;
无符号短b=0x80FF;
如果(a&0x8000)printf(“最高位集\n”);
if(a&0x4000)printf(“第二高位集\n”);
if(b&0x8000)printf(“b最高位集\n”);
if(b&0x4000)printf(“b第二高位集\n”);
返回0;
}
#定义真((uint8_t)1)
#定义false((uint8_t)0)
uint8是此指令类型0(uint16指令)
{
uint16_t和掩码=0x8000;
如果(((指令和掩码)>>15)==0)
{
andMask>>=1;
如果(((指令和掩码)>15)==0)
返回true;
}
否则返回false;
}
#定义真((uint8_t)1)
#定义false((uint8_t)0)
uint8是此指令类型0(uint16指令)
{
uint16_t和掩码=0x8000;
如果(((指令和掩码)>>15)==0)
{
andMask>>=1;
如果(((指令和掩码)>15)==0)
返回true;
}
否则返回false;
}
类似这样的内容:

int GetInstructionClass (uint16_t ins)
{
  return (ins>>14)&3;
}
此表达式:
(ins>>14)&3
的工作原理如下:

int GetInstructionClass (uint16_t ins)
{
  return (ins>>14)&3;
}
首先,
ins
具有以下格式:

cc X X X X X

其中
C
是构成指令类的位。
X
表示“现在不关心”

第一个操作,
>14
将数字向右移动,以如下方式结束:

int GetInstructionClass (uint16_t ins)
{
  return (ins>>14)&3;
}
0 0 0 0 0 0 0 0 0 0 0 C

请注意,由于我们使用的是
uint16\u t
,移位操作应该从左侧输入0,但是由于函数结果是
int
,并且
int
是有符号的,我不确定类型提升是否在移位执行之前或之后发生。我认为类型提升发生在整个ex的评估之后压力

无论如何,为了确保不会返回不需要的位,我们将屏蔽移位的结果,以便只保留位0和1。掩码为:

001这是3

最后的结果将是一个比特0和1与原始<代码> INS/COD>参数的比特14和15相同,给出0, 1, 2或3(我重复:假设整个表达式被当作16位数字)。这与MinGW,Visual C++和GCC在32位环境中一起工作。

< P> >类似的事情:

int GetInstructionClass (uint16_t ins)
{
  return (ins>>14)&3;
}
此表达式:
(ins>>14)&3
的工作原理如下:

int GetInstructionClass (uint16_t ins)
{
  return (ins>>14)&3;
}
首先,
ins
具有以下格式:

cc X X X X X

其中
C
是构成指令类的位。
X
表示“现在不关心”

第一个操作,
>14
将数字向右移动,以如下方式结束:

int GetInstructionClass (uint16_t ins)
{
  return (ins>>14)&3;
}
0 0 0 0 0 0 0 0 0 0 0 C

请注意,由于我们使用的是
uint16\u t
,移位操作应该从左侧输入0,但是由于函数结果是
int
,并且
int
是有符号的,我不确定类型提升是否在移位执行之前或之后发生。我认为类型提升发生在整个ex的评估之后压力

无论如何,为了确保不会返回不需要的位,我们将屏蔽移位的结果,以便只保留位0和1。掩码为:

001这是3

最后的结果是一个比特0和1与原来的<代码> INS/CONT>参数的比特14和15相同,给出0, 1, 2或3(我重复:我假设整个表达式被当作16位数字)。这与MinGW、Visual C++和GCC在32位环境中的工作原理相同。