如何计算0x71014802
等数字中最左边的6位
这6位告诉我们这段代码代表什么MIPS指令。
答案是0x1c
,但这本书是如何计算出来的?
示例:
0x10001A08 = 000011 00000 10000 01000 00000 000111
这个71014802
是如何转换成二进制文件的?我该如何做到这一点?
答案 0 :(得分:1)
第一个是十六进制数,可以直接将其转换为二进制数。每个HEX数字都可以转换成4个二进制数字,如下例所示
Ex $$_7=2^2+2^1+2^0=0111_$$
对于十六进制数0x71014802
0x71014802 => 0111 0001 0000 0001 0100 1000 0000 0010
7 1 0 1 4 8 0 2
关于从十进制到二进制的转换,我建议你将十进制转换为十六进制,然后十六进制转换为二进制,让我们用十进制做一个例子(我选择71014802 DEC)
71014802 => 0x43B9992 => 0000 0100 0011 1011 1001 1001 1001 0010
0 4 3 B 9 9 9 2
将十进制数转换为二进制数的另一种方法是除以2然后选择余数...但这是一个更长的过程(你可以找到它here)
无论如何,如果操作码处于固定位置(26-31),操作码可以通过掩码简单地获得并向右移动,如下所示:
opcode=(reg>>26)&0x3F
打印二进制数的算法可以是这样的:
void print_binary(int n) {
while (n) {
char bit = n & 0x1;
putchar (bit+'0');
n >>= 1;
}
putchar('\n');
}
答案 1 :(得分:0)
尝试:
char bits = (num >> (sizeof(num)*8 - 6)) & 0x3F;
0x3F = 00111111
将六位一直推到左边,为您提供所需的结果。
编辑:更详细的解释。
我们要做的是获取整数的最左边六位。为了确定某个位是否被翻转(即1或0),我们and
使用1
。获得一个数字的六位是通过构造一个包含六个翻转位00111111
或0x3F
的整数,并and
使用我们的数字来完成的:num & 0x3F
。这将给出整数的六个最右侧位,以获取左侧的位,我们将数字一直向左移动,并运行相同的and
操作:{ {1}}。
(num >> (sizeof(num)*8 - 6)) & 0x3F
EDIT2 :我的数学有点偏差,这就是你在午夜后浏览的结果...更新。