添加为二进制操作

时间:2012-05-22 12:23:37

标签: binary numbers primitive-types boolean-operations

我正在添加一对无符号32位二进制整数(包括溢出)。添加是表达而不是实际计算,因此不需要有效的算法,但由于每个组件是根据各个位手动指定的,因此我需要一个具有紧凑表示的组件。有什么建议吗?

编辑:就布尔运算符而言。所以我认为第一位是carry = a & b; sum = a ^ b;,而另一位是31?

哦,减法!

3 个答案:

答案 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)

  • 关于表示这些数字的数据结构部分。
  • 有4种方式

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