[英]C weird function variable assignment
我在學習如何制作虛擬機時找到了這段代碼。 但是我不知道此函數的作用。 你們中任何人都知道此功能在做什么嗎?
void decode( int instr )
{
instrNum = (instr & 0xF000) >> 12;
reg1 = (instr & 0xF00 ) >> 8;
reg2 = (instr & 0xF0 ) >> 4;
reg3 = (instr & 0xF );
imm = (instr & 0xFF );
}
變量instr
= 1。
這些是位操作 ,通常用於將一些標志緊湊地存儲在單個整數中。 此函數從參數instr
“讀取”位並將結果寫入其他字段。
該功能節省了4位(稱為特定集合啃從變量) instr
到其他變量instrNum
, reg1
等(這些其他變量必須有一個全球范圍內,因為他們不是在這里定義)。
考慮例如instr
為0x1234
instrNum = (0x1234 & 0xF000) >> 12;
= (0x1000) >> 12;
= 1
reg1 = (0x1234 & 0xF00) >> 8;
= (0x0200) >> 8;
= 2
reg2 = (0x1234 & 0xF0) >> 4;
= (0x0030) >> 4;
= 3
reg3 = (0x1234 & 0xF);
= (0x0004);
= 4
imm = (0x1234 & 0xFF);
= (0x0034);
= 52
因此,它將變量instr
每個半字節都保存到一個單獨的變量中。 最后一個變量imm
獲取最后一個字節。 &
和>>
是位運算符,用於分隔位的AND
運算符和右移運算符 。
任何人都猜測為什么要保存這些變量,我們需要知道這些變量是什么類型以及它們的用途,但是無論如何這就是正在發生的事情。
此功能似乎解碼的指令instr
成一個4位的指令代碼( instNum
),和最多三個寄存器4位的代碼( reg1
到reg3
)。 在您的虛擬機中,似乎還存在用於立即8位操作數( imm
)的編碼。 這是我對VM的16位指令集的猜測的說明:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.