C Rightshift无法正常工作

时间:2016-04-24 09:12:11

标签: c bit-manipulation lc3

我试图在C中实现LC3模拟器,在解析指令代码时,我遇到了麻烦。我有一个方法,get_bits(),它应该得到指定的short int的位(定义为' Word')。

Word get_bits(Word val, Word leftBit, Word rightBit){
    printf("\nWord: %x, LeftBit: %d, RightBit: %d\n", val,leftBit,rightBit);
    Word leftPad = 15 - leftBit;
    Word rightPad = leftPad + rightBit;
    printf("LeftPad: %d RightPad: %d\n", leftPad,rightPad);
    printf("Val   : "); printBinary(val);  printf("\n");
    Word temp = val << leftPad;
    printf("Temp L: "); printBinary(temp); printf("\n");    
    temp = val >> rightPad;
    printf("Temp R: "); printBinary(temp); printf("\n");    


    //build mask
   Word mask = 0x0;
   switch(leftBit - rightBit){
        case 3:
            mask = 0x000F;
            break;
        case 2:
            mask = 0x0007;
            break;
        default:
            printf("Case Not Covered!");
            break;
    }
    printf("Mask:   "); printBinary(mask); printf("\n");
    temp = temp & mask;
    return temp;    
}

对于给定指令1221,ASM应为ADD R1,R0,1 但是,get_bits()函数在第二次解析时失败。 它正确地解析了&#34; ADD&#34; part,这是前四位,但是当试图解析R1部分时,它右移多次,我不明白为什么。输出:

@ 4096 (1000) Value: 4641   1221 ASM: 

前4位=&#34; ADD&#34;,正常工作

Word: 1221, LeftBit: 15, RightBit: 12
LeftPad: 0 RightPad: 12
Val   : 0001001000100001
Temp L: 0001001000100001
Temp R: 0000000000000001
Mask:   0000000000001111
ADD 

应该得到第11-9位,3位构成寄存器1(&#34; 001&#34;),但是转移到0

Word: 1221, LeftBit: 11, RightBit: 9
LeftPad: 4 RightPad: 13
Val   : 0001001000100001
Temp L: 0010001000010000
Temp R: 0000000000000000
Mask:   0000000000000111

应该得到位8 - 6,3位构成寄存器0(&#34; 000&#34;),正确读取

Word: 1221, LeftBit: 8, RightBit: 6
LeftPad: 7 RightPad: 13
Val   : 0001001000100001
Temp L: 0001000010000000
Temp R: 0000000000000000
Mask:   0000000000000111

R0, R0, 

那么为什么我的右移不适用于第二次通话,但是第一次和最后一次通话都能正常工作?

1 个答案:

答案 0 :(得分:0)

问题来自您的rightPad中还有leftPad。没有必要在向函数提供的右移量中添加任何内容。只需向右移动那就可以了。

为什么第一次发生错误的原因是leftBit为15,因此15 - 15为零,而您只移动rightBit的数量。< / p>

如此简单

temp = val >> rightBit;