当前位置: 首页 > news >正文

二进制求和 - 简单

*************

C++

topic: 67. 二进制求和 - 力扣(LeetCode)

*************

Give the topic an inspection.

Too many works these days. And no spare time for code learning. However here I am gagin.

This topic is an easy one and I want to practice some skills about namespace, class and so on. So todays study might have some fun.

binary is every, it is something like to be or not to be. It just has 0 and 1.

自己动手制作计算机CPU的核心部件,二进制加法器

so the code is really to say.

first to get the size and define a string to store the sumation. Adding another single bit need int carry help.

class Solution {
public:string addBinary(string a, string b) {string result; // 存储最终结果的二进制字符串int i = a.size() - 1; // 指针i初始指向字符串a的最后一个字符(最低位)int j = b.size() - 1; // 指针j初始指向字符串b的最后一个字符(最低位)int carry = 0; // 进位标志,初始化为0// 循环条件:当任意一个字符串还有未处理的位,或者还有进位需要处理时继续while (i >= 0 || j >= 0 || carry > 0) {// 获取当前位的数字,如果指针已越界则补0int digitA = (i >= 0) ? (a[i] - '0') : 0; // 将字符转换为数字('0'->0, '1'->1)int digitB = (j >= 0) ? (b[j] - '0') : 0; // 同上// 计算当前位的总和(包括进位)int sum = digitA + digitB + carry;// 计算新的进位(二进制逢2进1)carry = sum / 2; // 如果sum>=2则carry=1,否则carry=0// 计算当前位的值(取sum对2的余数)int currentDigit = sum % 2; // 结果为0或1// 将当前位的结果存入result(注意这里是从低位到高位顺序存储的)result.push_back(currentDigit + '0'); // 将数字转换回字符格式// 移动指针到前一位i--; // 处理a的前一位j--; // 处理b的前一位}// 由于我们是先计算低位后计算高位,需要反转字符串得到正确顺序reverse(result.begin(), result.end());// 返回最终结果return result;}
};

take an example: a = "1"b = "1"(即 1 + 1,二进制结果应为 "10"

步骤当前执行代码行变量状态变化 (ijcarryresult)条件判断结果循环次数输出内容操作注释
1string a = "1";a = "1"---初始化输入 a
2string b = "1";b = "1"---初始化输入 b
3string result;result = ""---初始化空结果
4int i = a.size()-1;i = 0---指向 a 的最后一位 ('1')
5int j = b.size()-1;j = 0---指向 b 的最后一位 ('1')
6int carry = 0;carry = 0---初始化进位为 0
7while (i >= 0 || j >= 0 || carry > 0)i=0j=0carry=0 → 进入循环true (满足任一)1-第一次循环开始
8int digitA = (i >= 0) ? (a[i]-'0') : 0;digitA = 1 (a[0]='1' → 1)i >= 0 为 true1-取 a 的当前位 '1' 并转为数字 1
9int digitB = (j >= 0) ? (b[j]-'0') : 0;digitB = 1 (b[0]='1' → 1)j >= 0 为 true1-取 b 的当前位 '1' 并转为数字 1
10int sum = digitA + digitB + carry;sum = 1 + 1 + 0 = 2-1-计算当前位和进位总和
11carry = sum / 2;carry = 0 → **1**-1-更新进位:2 / 2 = 1
12int currentDigit = sum % 2;currentDigit = 0 (2 % 2 = 0)-1-计算当前位值:0
13result.push_back(currentDigit + '0');result = "" → **"0"**-1-将 '0' 存入 result
14i--; j--;i = 0 → **-1**, j = 0 → -1 `-1-移动指针到前一位(越界)
15while (i >= 0 || j >= 0 || carry > 0)i=-1j=-1carry=1 → 进入循环true (carry > 0)2-第二次循环(因 carry=1 继续)
16int digitA = (i >= 0) ? (a[i]-'0') : 0;digitA = 0 (i < 0)i >= 0 为 false2-a 已越界,补 0
17int digitB = (j >= 0) ? (b[j]-'0') : 0;digitB = 0 (j < 0)j >= 0 为 false2-b 已越界,补 0
18int sum = digitA + digitB + carry;sum = 0 + 0 + 1 = 1-2-计算当前位和进位总和
19carry = sum / 2;carry = 1 → **0** -2-更新进位:1 / 2 = 0
20int currentDigit = sum % 2;currentDigit = 1 (1 % 2 = 1)-2-计算当前位值:1
21result.push_back(currentDigit + '0');result = "0" → **"01"** -2-将 '1' 存入 result
22i--; j--;i = -1 → **-2** , j = -1 → -2`-2-移动指针(越界)
23while (i >= 0 || j >= 0 || carry > 0)i=-2j=-2carry=0 → 退出循环false (全不满足)--循环终止
24reverse(result.begin(), result.end());result = "01" → **"10"**---反转结果字符串
25return result;---"10"返回最终结果 "10"

and the function is in class Solution, what if I put the calculation function in class calculationBinary?

// 专门负责二进制计算逻辑的类
class CalculationBinary 
{
public:string add(string a, string b) {string result;int i = a.size() - 1;  // 指向a的末位(最低位)int j = b.size() - 1;  // 指向b的末位(最低位)int carry = 0;         // 进位标志// 当任意数字还有未处理的位或存在进位时继续while (i >= 0 || j >= 0 || carry > 0) {// 获取当前位数字(越界补0)int digitA = (i >= 0) ? (a[i--] - '0') : 0;int digitB = (j >= 0) ? (b[j--] - '0') : 0;// 计算当前位总和及进位int sum = digitA + digitB + carry;carry = sum / 2;           // 计算新进位result.push_back((sum % 2) + '0');  // 存储当前位}// 反转得到高位优先的顺序reverse(result.begin(), result.end());return result;}
};// 对外提供的接口类
class Solution {
public:string addBinary(string a, string b) {CalculationBinary calculator;  // 创建计算器实例return calculator.add(a, b);   // 调用计算方法}
};

相关文章:

  • 数据加载与保存
  • Ubuntu服务器中了木马且处于局域网内无法直接通过公网正向连接
  • Mac OS系统下kernel_task占用大量CPU资源导致系统卡顿
  • Linux:Makefile
  • 数字电子技术基础(四十七)——使用Mutlisim软件来模拟74LS85芯片
  • STM32基础教程——DMA+ADC多通道
  • 【后端】【python】利用反射器----动态设置装饰器
  • 智能语音处理+1.1下载需要的库(100%实现)
  • 【Lerobot】加载本地数据LeRobotDataset数据、读取并解析parquet
  • 【c语言】深入理解指针1
  • 排序(java)
  • 任务的状态
  • 投资理财_从0到1:如何用1000元开启你的二级市场投资之旅?
  • 实战5:Python使用循环神经网络生成诗歌
  • 解决virtualbox7.1无法启动3d加速的问题
  • 大数据人工智能
  • 算法的时间复杂度
  • L37.【LeetCode题解】三数之和(双指针思想)
  • Java练习——day2(集合嵌套)
  • Nginx:轻量级高性能的Web服务器与反向代理服务器
  • php网站建设步骤/外链吧
  • 网络公司怎么优化网站/开发一个app需要多少钱
  • 梧州网站平台建设公司/百度网站的网址
  • 湖北网站建设路/搜索引擎优化的作用是什么
  • 有了网站 怎么做排名优化/什么软件可以推广自己的产品
  • 做淘宝美工需要知道的网站/网页seo优化