我如何从我的机器代码中屏蔽我不想要的位?

How do i mask the bits i dont want from my machinecode?

所以我有一个 txt 文件,我正在使用类似 02324020 的数字,这是 MIPS 指令的机器代码:add $t0, $s1, $s2

当它是二进制并分成 6,5,5,5,5,6 的部分时,取的数字是:0,17,18,8,0,20

这给出了指令的概念 R[rd] = R[rs]+R[rt] 并且从 26-31 的数字是操作码 0 表示 R 格式,rd=8,rs=17,rt =18

我试图屏蔽这些位,这样我只能看到 21-25 之间的位,然后收到它们的数字:0,17,18,8,0,20,因为向右移动:printf("\n%x\n", code >>26); 给我操作码 0 并告诉我它是 R 格式。

所以现在我试图找到 17,但我不知道在 & 0b 之后放置什么:

printf("\n%x\n", code >>21 & 0b____);

我真的可以用一个例子从我的号码 02324020 中找出剩余的号码

到目前为止,这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{

    unsigned int code = 0;
    FILE *fp;
    fp = fopen(argv[1], "r+");
    int result = fscanf(fp, "%x", &code);
    printf("\n hex-1: %08X, decimal-1: %d \n", code, code);

    printf("\n%x\n", code >>26);
    printf("\n%x\n", code >>21 & 0x0b00000011111); //what can i do to change this
    while (result != EOF)
    {
        result = fscanf(fp, "%x", &code);
        printf("\n read hex: %08X, decimal: %d \n", code, code);
        if(feof(fp))
        {
            puts("EOF");
            break;
        }//if
    }//while
}

要定义二进制数,您将使用 0b___(正如您在回答中提到的),而不是 0x0b0___

要提取所需的数字,您必须进行位移 code,以便您感兴趣的位位于最右端。然后 OR 只有你感兴趣的那些位。把这些放在一起,你有:

printf("\n%x\n", code >> 26);
printf("\n%x\n", code >> 21 &  0b11111);
printf("\n%x\n", code >> 16 &  0b11111);
printf("\n%x\n", code >> 11 &  0b11111);
printf("\n%x\n", code >>  6 &  0b11111);
printf("\n%x\n", code       & 0b111111);