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