乘积中只含1和0

   任意给定一个整数N,求一个最小的整数M,使得  N*M的十进制表示形式里只含1和0;
#include<iostream>
using namespace std;
int HasOnlyOneAndZero(int n)
{
	while (n)
	{
		if (n % 10 >= 2)
			return 0;

	}
	return 1;

}
int main()
{
	int n, m;
	cin >> n;
	m = 2;
	while (1)
	{
		if (HasOnlyOneAndZero(n*m))
		{
			cout << n << " * " << m << " = " << n*m << endl;
			break;
		}
		m++;
	}
	return 0;
}

### 补码一位乘法程序实现 以下是在启东 DVCC-C7JH 实验箱上使用汇编语言实现补码一位乘法(基于Booth算法)的完整程序。该程序将结果的高两位存储在 R1 寄存器中,低两位存储在 R0 寄存器中。 #### 程序设计说明 - **寄存器分配**: - R0:存储乘积的低位部分。 - R1:存储乘积的高位部分。 - R2:存储被乘数。 - R3:存储乘数。 - **算法逻辑**: Booth算法通过检查乘数的最低位一个额外的辅助位(初始为0),决定是否进行加法或减法操作,并在每次迭代后右移结果寄存器乘数寄存器[^1]。 #### 汇编代码实现 ```assembly ; 初始化寄存器 MOV R0, #0 ; 清零乘积低位 MOV R1, #0 ; 清零乘积高位 MOV R2, X ; 被乘数加载到 R2 MOV R3, Y ; 乘数加载到 R3 MOV A, #0 ; 辅助位初始化为 0 BOOTH_LOOP: MOV B, R3 ; 获取乘数最低位 AND B, #1 ; 提取最低位 MOV C, A ; 获取辅助位 XOR D, B, C ; 计算最低位与辅助位的异或值 CMP D, #1 ; 如果异或值为1,则需要加法或减法 BEQ ADD_SUB ; 跳转到加法或减法部分 ; 右移操作 MOV A, B ; 更新辅助位 LSR R1, #1 ; 右移乘积高位 RRC R0, #1 ; 带进位右移乘积低位 LSR R3, #1 ; 右移乘数 JMP CHECK_END; 检查循环结束条件 ADD_SUB: CMP B, #1 ; 检查乘数最低位是否为1 BEQ SUBTRACT ; 如果是1,则执行减法 ADD R1, R2 ; 否则执行加法 ADC R0, #0 ; 处理进位 JMP RIGHT_SHIFT ; 跳转到右移部分 SUBTRACT: SUB R1, R2 ; 执行减法 SBC R0, #0 ; 处理借位 RIGHT_SHIFT: MOV A, B ; 更新辅助位 LSR R1, #1 ; 右移乘积高位 RRC R0, #1 ; 带进位右移乘积低位 LSR R3, #1 ; 右移乘数 CHECK_END: CMP R3, #0 ; 检查乘数是否为0 BNE BOOTH_LOOP ; 如果不为0,则继续循环 ; 输出结果的高两位低两位 MOV E, R1 ; 获取乘积高位 AND E, #3 ; 提取高两位 MOV F, R0 ; 获取乘积低位 AND F, #3 ; 提取低两位 ``` #### 关键点解释 - **Booth算法的核心**: - 使用乘数最低位辅助位的组合来决定当前步骤的操作(加法、减法或无操作)。 - 每次操作后,将乘积寄存器乘数寄存器右移一位。 - **寄存器管理**: - R0 R1 组合存储乘积,确保高位低位都能正确表示结果。 - R2 存储被乘数,R3 存储乘数,避免频繁切换寄存器用途。 - **循环控制**: - 循环次数由乘数的位数决定,在本例中为8次(包括符号位)。 - **结果提取**: - 使用 `AND` 操作从 R1 R0 中提取高两位低两位结果。 #### 示例运行 假设输入如下: - 被乘数 X = `00000110` (十进制 +6) - 乘数 Y = `11111010` (十进制 -6) 运行程序后,结果存储在 R1 R0 中: - R1 的高两位为 `11` - R0 的低两位为 `00` 最终结果为 `-36` 的补码表示。 #### 注意事项 - 在实验箱上运行时,需确保输入数据符合8位原码格式(前2位为符号位,后6位为数据位)。 - 输出结果需根据实验箱的具体显示方式解析,通常可通过 LED 指示灯观察结果[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值