位相加溢出

提莫1

假設(shè) n, m, s 的都是 4-bit 補碼數(shù), 且 s 是 n 和 m 相加的結(jié)果. 如果只允許使用邏輯運算, 如何判斷 n 和 m 相加的結(jié)果是否溢出? 編寫一個程序, 輸入n, m 和 s 的值, 如果 n 和 m 相加溢出, 則輸出 1000; 如果沒有溢出, 則輸出 0000.

補碼相加溢出判定: 若兩個操作數(shù)為正, 而結(jié)果為負; 或者兩個操作數(shù)為負, 而結(jié)果為正, 則溢出 (一正一負相加, 永遠不會溢出).

int m, n, s;
// 兩操作數(shù)為正 
// (NOT m) AND (NOT n) AND 1000
!m & !n & 1000 == 1000;
// 兩操作數(shù)為正, 結(jié)果s為負 
// (NOT m) AND (NOT n) AND s AND 1000
!m & !n & s & 1000 == 1000;

// 兩操作數(shù)為負
// m AND n AND 1000
m & n & 1000 == 1000;
// 兩操作數(shù)為負, 結(jié)果s為正
// m AND n AND (NOT s) AND 1000
m & n & !s & 1000 == 1000;

// 合并兩種情況
// ( (NOT m) AND (NOT n) AND s ) OR ( m AND n AND (NOT s) ) AND 1000
( (!m & !n & s) | (m & n & !s) ) & 1000 == 1000
    

提莫2

假設(shè) n, m, s 的都是 4-bit 無符號整數(shù), 且 s 是 n 和 m 相加的結(jié)果. 如果只允許使用邏輯運算, 如何判斷 n 和 m 相加的結(jié)果是否溢出? 編寫一個程序, 輸入n, m 和 s 的值, 如果 n 和 m 相加溢出, 則輸出 1000; 如果沒有溢出, 則輸出 0000.

無符號4-bit整數(shù)相加溢出判定: 結(jié)果 s 的最左位發(fā)生進位, 則為溢出

//1. 若m和n的最左位都是1, s必然發(fā)生進位
// m AND N AND 1000
m & n & 1000 == 1000;

//2. 若m和n的最左位都是0, s必然不會發(fā)生進位
//3. 若m最左位為1, n最左位為0, 且s最左位不為1, 則發(fā)生進位
// m AND (NOT n) AND (NOT s) AND 1000
m & !n & !s & 1000 == 1000;

//4. 若m最左位為0, n最左位為1, 且s最左位不為1, 則發(fā)生進位
// (NOT m) AND n AND (NOT s) AND 1000
!m & n & !s & 1000;

// 3,4 合一, 即有且只有一個操作數(shù)的最左位為1, s最左位不為1
// (( m AND (NOT n) ) OR ( (NOT m) AND n )) AND (NOT s) AND 1000
// 即 (m XOR n) AND (NOT s) AND 1000
(m ^ n) & !s & 1000 == 1000
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容