對於帶符號右移,若為負數,則在儲存時首位表示符號位,其值為1,表示該值是負數的移位,在移位過程中,高位補1,若符號位是0,表示是正數,在移位過程中高位補零,兩者的前提是符號位保持不變:
對於負數的右移:因為負數在記憶體中是以補碼形式存在的,所有首先根據負數的原碼求出負數的補碼(符號位不變,其餘位按照原碼取反加1),然後保證符號位不變,其餘位向右移動到x位,在移動的過程中,高位補1.等移位完成以後,然後保持符號位不變,其餘按位取反加1,得到移位後所對應數的原碼。即為所求。
舉例1:
-100帶符號右移4位。
-100原碼: 10000000 00000000 00000000 01100100
-100補碼: 保證符號位不變,其餘位置取反加1
11111111 11111111 11111111 10011100
右移4位 : 在高位補1
11111111 11111111 11111111 11111001
補碼形式的移位完成後,結果不是移位後的結果,要根據補碼寫出原碼才是我們所求的結果。其方法如下:
保留符號位,然後按位取反
10000000 00000000 00000000 00000110
然後加1,即為所求數的原碼:
10000000 00000000 00000000 00000111
所有結果為:-7
舉例2:
-100無符號右移4位。
-100原碼: 10000000 00000000 00000000 01100100
-100補碼: 保證符號位不變,其餘位置取反加1
11111111 11111111 11111111 10011100
無符號右移4位 : 在高位補0
00001111 11111111 11111111 11111001
即為所求:268435449
總結:正數的左移與右移,負數的無符號右移,就是相應的補碼移位所得,在高位補0即可。
負數的右移,就是補碼高位補1,然後按位取反加1即可。
關於負數的右移與無符號右移運算小結
對於帶符號右移,若為負數,則在儲存時首位表示符號位,其值為1,表示該值是負數的移位,在移位過程中,高位補1,若符號位是0,表示是正數,在移位過程中高位補零,兩者的前提是符號位保持不變 對於負數的右移 因為負數在記憶體中是以補碼形式存在的,所有首先根據負數的原碼求出負數的補碼 符號位不變,其餘位按照原...
關於負數的右移》與無符號右移》運算小結
對於帶符號右移,若為負數,則在儲存時首位表示符號位,其值為1,表示該值是負數的移位,在移位過程中,高位補1,若符號位是0,表示是正數,在移位過程中高位補零,兩者的前提是符號位保持不變 對於負數的右移 因為負數在記憶體中是以補碼形式存在的,所有首先根據負數的原碼求出負數的補碼 符號位不變,其餘位按照原...
無符號右移負數 FPGA 中的有符號數乘法
fpga中乘法器是很稀缺的資源,但也是我們做演算法必不可少的資源。7系列及之前的fpga都是25x18的dsp,ultrascale中是27x18,我們可以通過調ip core的方式或者原語的方式來進行乘法操作。在裡面可以設定有符號還是無符號數乘法。當然,我們也可以直接使用 符合來進行乘法,對於無符...