Binary 作为二进制操作的加法

Binary 作为二进制操作的加法,binary,numbers,primitive-types,boolean-operations,Binary,Numbers,Primitive Types,Boolean Operations,我正在添加一对无符号32位二进制整数(包括溢出)。加法是表示性的,而不是实际计算的,因此不需要有效的算法,但是由于每个组件都是根据单个位手动指定的,因此我需要一个具有紧凑表示的组件。有什么建议吗 编辑:根据布尔运算符。所以我想,carry=a&b;总和=a^b第一位,但其他31位 哦,还有减法 也许您可以先说明两个1位数字的加法,并带有溢出(=进位): 为了进一步推广这一点,您需要一个“”从上一阶段开始,它也将进位作为输入。然后,您可以将32位加法表示为32个这样的全加器链(第一级进位输入绑定到

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

编辑:根据布尔运算符。所以我想,
carry=a&b;总和=a^b第一位,但其他31位


哦,还有减法

也许您可以先说明两个1位数字的加法,并带有溢出(=进位):

为了进一步推广这一点,您需要一个“”从上一阶段开始,它也将进位作为输入。然后,您可以将32位加法表示为32个这样的全加器链(第一级进位输入绑定到0)。

  • 关于数据结构部分表示这些数字。有4种方法
1)
位数组

位数组是一种紧凑存储单个位的数组数据结构。
它们也称为位图、位集或位字符串

2)
位字段

位字段是计算机编程中常用的一种习惯用法,它将多个逻辑值紧凑地存储为一个短的位序列,其中每个位都可以单独寻址

3)
位平面

数字离散信号(例如图像或声音)的位平面是与表示该信号的每个二进制数中的给定位位置相对应的一组位

4)
位板

比特板或比特字段是一种格式,它将一组相关的布尔变量填充到同一个整数中,通常表示棋盘游戏中的位置

  • 关于实施,您可以检查每个步骤,我们都有以下内容
    S=a异或b异或c
S是当前位a和b之和的结果
c是输入进位


Cout-输出进位是
(a&b)xor(c&(a-xor b))

你不能用简单的布尔运算符进行加法,你需要一个加法器。(当然,加法器可以使用更复杂的布尔运算符构建。) 加法器将两位加上进位,并将进位传递给下一位

伪代码:

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

感谢您提及这些数据结构。这完全回答了我问题中关于他们的部分。
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