我正在添加一对无符号32位二进制整数(包括溢出)。添加是表达而不是实际计算,因此不需要有效的算法,但由于每个组件是根据各个位手动指定的,因此我需要一个具有紧凑表示的组件。有什么建议吗?
编辑:就布尔运算符而言。所以我认为第一位是carry = a & b; sum = a ^ b;
,而另一位是31?
哦,减法!
答案 0 :(得分:0)
也许你可以先说两个1位数的加法,加溢(=进位):
A | B | SUM | CARRY
===================
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
为了进一步概括,你需要一个“full adder”,它也可以从前一阶段获取一个进位作为输入。然后你可以将32位加法表示为32个这样的全加法器链(第一级的进位输入连接到0)。
答案 1 :(得分:0)
1)Bit Array
位数组是一种紧凑存储各个位的数组数据结构
它们也称为位图,bitset或bitstring。
2)Bit Field
位字段是计算机编程中常用的惯用语,用于将多个逻辑值紧凑地存储为一小部分位,其中每个单个位可以单独寻址。
3)Bit Plane
数字离散信号(例如图像或声音)的位平面是一组位,对应于表示信号的每个二进制数中的给定位位置。
4)Bit Board
位板或位字段是将整组相关布尔变量填充到同一整数中的格式,通常表示棋盘游戏中的位置。
S = a xor b xor c
S是当前比特a和b
的总和的结果
c是输入进位
Cout - 输出值为(a & b) xor (c & (a xor b))
答案 2 :(得分:0)
你不能用简单的布尔运算符执行加法,你需要一个加法器。 (当然,可以使用一些更复杂的布尔运算符构建加法器。) 加法器增加两位加进位,并传递进入下一位。
伪代码:
carry = 0
for i = 31 to 0
sum = a[i] + b[i] + carry
result[i] = sum & 1
carry = sum >> 1
next i
这是使用VEDIT文本编辑器的宏语言的实现。 要添加的两个数字以ASCII字符串形式给出,每行一个。 结果将插入第三行。
Reg_Empty(10) // result as ASCII string
#0 = 0 // carry bit
for (#9=31; #9>=0; #9--) {
#1 = CC(#9)-'0' // a bit from first number
#2 = CC(#9+34)-'0' // a bit from second number
#3 = #0+#1+#2 // add with carry
#4 = #3 & 1 // resulting bit
#0 = #3 >> 1 // new carry
Num_Str(#4, 11, LEFT) // convert bit to ASCII
Reg_Set(10, @11, INSERT) // insert bit to start of string
}
Line(2)
Reg_Ins(10) IN
Return
输入和输出示例:
00010011011111110101000111100001
00110110111010101100101101110111
01001010011010100001110101011000
编辑:
这里是伪代码,其中加法器已经用布尔运算实现:
carry = 0
for i = 31 to 0
sum[i] = a[i] ^ b[i] ^ carry
carry = (a[i] & b[i]) | (a[i] & carry) | (b[i] & carry)
next i