提莫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