提莫1
假设 n, m, s 的都是 4-bit 补码数, 且 s 是 n 和 m 相加的结果. 如果只允许使用逻辑运算, 如何判断 n 和 m 相加的结果是否溢出? 编写一个程序, 输入n, m 和 s 的值, 如果 n 和 m 相加溢出, 则输出 1000; 如果没有溢出, 则输出 0000.
补码相加溢出判定: 若两个操作数为正, 而结果为负; 或者两个操作数为负, 而结果为正, 则溢出 (一正一负相加, 永远不会溢出).
int m, n, s;
// 两操作数为正
// (NOT m) AND (NOT n) AND 1000
!m & !n & 1000 == 1000;
// 两操作数为正, 结果s为负
// (NOT m) AND (NOT n) AND s AND 1000
!m & !n & s & 1000 == 1000;
// 两操作数为负
// m AND n AND 1000
m & n & 1000 == 1000;
// 两操作数为负, 结果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
假设 n, m, s 的都是 4-bit 无符号整数, 且 s 是 n 和 m 相加的结果. 如果只允许使用逻辑运算, 如何判断 n 和 m 相加的结果是否溢出? 编写一个程序, 输入n, m 和 s 的值, 如果 n 和 m 相加溢出, 则输出 1000; 如果没有溢出, 则输出 0000.
无符号4-bit整数相加溢出判定: 结果 s 的最左位发生进位, 则为溢出
//1. 若m和n的最左位都是1, s必然发生进位
// m AND N AND 1000
m & n & 1000 == 1000;
//2. 若m和n的最左位都是0, s必然不会发生进位
//3. 若m最左位为1, n最左位为0, 且s最左位不为1, 则发生进位
// m AND (NOT n) AND (NOT s) AND 1000
m & !n & !s & 1000 == 1000;
//4. 若m最左位为0, n最左位为1, 且s最左位不为1, 则发生进位
// (NOT m) AND n AND (NOT s) AND 1000
!m & n & !s & 1000;
// 3,4 合一, 即有且只有一个操作数的最左位为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