1073. 负二进制数相加

博客围绕基数为 -2 的两个数相加展开,两数以数组形式呈现,数组由 0 和 1 组成且无 前导零。给出了计算示例及输入输出要求,还给出了输入数组的长度、元素取值等提示。

给出基数为 -2 的两个数 arr1 和 arr2,返回两数相加的结果。

数字以 数组形式 给出:数组由若干 0 和 1 组成,按最高有效位到最低有效位的顺序排列。例如,arr = [1,1,0,1] 表示数字 (-2)^3 + (-2)^2 + (-2)^0 = -3。数组形式 的数字也同样不含前导零:以 arr 为例,这意味着要么 arr == [0],要么 arr[0] == 1。

返回相同表示形式的 arr1 和 arr2 相加的结果。两数的表示形式为:不含前导零、由若干 0 和 1 组成的数组。

 

示例:

输入:arr1 = [1,1,1,1,1], arr2 = [1,0,1]
输出:[1,0,0,0,0]
解释:arr1 表示 11,arr2 表示 5,输出表示 16 。

 

提示:

    1 <= arr1.length <= 1000
    1 <= arr2.length <= 1000
    arr1 和 arr2 都不含前导零
    arr1[i] 为 0 或 1
    arr2[i] 为 0 或 1

 

### 补码加减法的计算与溢出判断 在计算机中,补码用于表示有符号整,并通过补码进行加减运算。以下是关于如何使用补码加减法计算二进制 [X+Y] 补 和 [X−Y] 补 的方法,以及如何判断结果是否溢出。 #### 1. 计算 [X+Y] 补 [X+Y] 补 的计算可以通过直接将 X 和 Y 的补码相加完成。具体步骤如下: - 确保 X 和 Y 已经转换为补码形式。 - 将 [X] 补 和 [Y] 补 相加,得到的结果即为 [X+Y] 补。 - 如果最高位(符号位)发生进位,则忽略该进位[^3]。 例如,已知 X = +0100010 和 Y = -0110100: - [X] 补 = 00100010 - [Y] 补 = 11001100 - [X+Y] 补 = 00100010 + 11001100 = 11101110[^3] #### 2. 计算 [X−Y] 补 [X−Y] 补 的计算可以转化为 [X] 补 加上 [-Y] 补 的操作。具体步骤如下: - 确保 X 和 Y 已经转换为补码形式。 - 计算 [-Y] 补,即将 Y 的补码取反并加 1。 - 将 [X] 补 和 [-Y] 补 相加,得到的结果即为 [X−Y] 补[^4]。 例如,已知 X = +0100010 和 Y = -0110100: - [X] 补 = 00100010 - [Y] 补 = 11001100 - [-Y] 补 = (11001100 取反后加 1) = 00110100 - [X−Y] 补 = 00100010 + 00110100 = 01010110 #### 3. 判断溢出 溢出的判断取决于两个条件: - **正溢出**:当两个正相加时,结果为负,则发生正溢出。 - **负溢出**:当两个负相加时,结果为正,则发生负溢出。 在补码加法中,可以通过以下规则判断溢出: - 如果两个操作的符号相同,但结果的符号与操作不同,则发生溢出[^5]。 - 在二进制表示中,如果最高位(符号位)产生进位,但低 n-1 位没有进位,则发生溢出。 例如,对于 8 位二进制: - 若 [X] 补 = 01111111(+127),[Y] 补 = 00000001(+1),则 [X+Y] 补 = 10000000(-128),此时发生正溢出。 - 若 [X] 补 = 10000000(-128),[Y] 补 = 11111111(-1),则 [X+Y] 补 = 01111111(+127),此时发生负溢出。 ```python def twos_complement_add(x, y): # 假设 x 和 y 是 8 位二进制补码 result = (x + y) % 256 # 模 2^8 return result def twos_complement_subtract(x, y): # 假设 x 和 y 是 8 位二进制补码 neg_y = (~y + 1) % 256 # 计算 -y 的补码 result = (x + neg_y) % 256 # 模 2^8 return result def check_overflow(x, y, result): # 判断是否溢出 if (x > 0 and y > 0 and result < 0) or (x < 0 and y < 0 and result > 0): return True return False ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值