1.6 不用算术符号实现加法

本文探讨如何利用逻辑运算实现整数加法,避免使用加号或其他算术运算符,通过异或和位移操作完成数字的加法运算。

1. 6 Write a function that adds two numbers. You should not use + or any arithmetic operators.

一看就是需要用逻辑运算实现加法。

逻辑运算有一些很巧妙的运用,比如不需要借助第三个变量,就可以交换两个变量的值:

a=a^b;

b=b^a;

a=b^a;

异或运算有两个特性:

1、一个数异或本身恒等于0,如5^5恒等于0;

2、一个数异或0恒等于本身,如5^0恒等于5。

交换两个整数a和b,无非是a=b和b=a这两个操作,当然,你不能直接这么做。该怎么变呢?

算式一:a=b^(a^a)=a^(a^b);

算式二:b=a^(b^b)^(a^a)=a^(a^b)^(a^b);

注意上面算式二中的a还是原来的a,不要认为是改变后的a。

为什么右边的式子都留个a,没为什么,我就是想把b做为临时变量来用,此处要注意,既然做为临时变量用那么b就是最后才计算出来的数。接下来认真的分析下上面的两个算式。得出以下java语句:

把a^b做为临时变量值赋给b(临时变量),得

b=a^b;

计算出a:

a=a^b;注意这时的b可就是上面的式子已改变过的b了。

计算出b:

b=a^b;注意仔细观察上面的式二。

至此完成了两个整数的交换。


本题的答案

To investigate this problem, let’s start off by gaining a deeper understanding of how we add
numbers. We’ll work in Base 10 so that it’s easier to see. To add 759 + 674, I would usually add
digit*0 from each number, carry the one, add digit[1] from each number, carry the one, etc.
You could take the same approach in binary: add each digit, and carry the one as necessary.
Can we make this a little easier? Yes! Imagine I decided to split apart the “addition” and “carry”
steps. That is, I do the following:
1. Add 759 + 674, but “forget” to carry. I then get 323.
2. Add 759 + 674 but only do the carrying, rather than the addition of each digit. I then
get 1110.
3. Add the result of the first two operations (recursively, using the same process described
in step 1 and 2): 1110 + 674 = 1433.
Now, how would we do this in binary?
1. If I two binary numbers together but forget to carry, bit[i] will be 0 if bit[i] in a and b are
both 0 or both 1. This is an xor.
2. If I add two numbers together but only carry, I will have a 1 in bit[i] if bit[i-1] in a and b
are both 1’s. This is an and, shifted.
3. Now, recurse until there’s nothing to carry.

int add_no_arithm(int a, int b) {
if (b == 0) return a;
<span style="white-space:pre">	</span>int sum = a ^ b; // add without carrying
<span style="white-space:pre">	</span>int carry = (a & b) << 1; // carry, but don’t add
<span style="white-space:pre">	</span>return add_no_arithm(sum, carry); // recurse
}


<think>首先,用户要求使用中文回答问题。用户的问题是关于C#编程的,分成几个部分:简单变量、接收用户输入等。具体问题包括: 1. C#简单变量 - 1.1 常用的简单类型有哪些? - 1.2 decimal是整型还是浮点? - 1.3 + 运算符的2个意思? - 1.4 占位符如何使用?有哪些注意事项? - 1.5 异常和报错区别? - 1.6 如何交换2个整型变量的值?2个写法 2. 接收用户输入 - 2.1 什么类型接收? - 2.2 转义字符是什么?常用的有哪些?@符号2个作用? - 2.3 算术运算符 用户还指定了回答的格式:在回答完问题后,必须提出3-5个相关问题,并以“§§相关问题§§”开头,然后列出1. 2. 3. 等。问题必须输出在末尾,且第一行必须是“§§相关问题§§”,禁止换行分散。 示例格式显示了一个关于快速排序的回答,然后有相关问题。 所以,我需要先回答所有问题,然后提出相关问题。 现在,组织我的回答: - 回答应该清晰、准确,使用中文。 - 问题列表: 1.1: 常用的简单类型有哪些? 1.2: decimal是整型还是浮点? 1.3: + 运算符的2个意思? 1.4: 占位符如何使用?有哪些注意事项? 1.5: 异常和报错区别? 1.6: 如何交换2个整型变量的值?2个写法 2.1: 什么类型接收? (用户输入) 2.2: 转义字符是什么?常用的有哪些?@符号2个作用? 2.3: 算术运算符 (可能用户忘记写具体问题了,但根据上下文,可能是关于接收用户输入部分的算术运算符?用户写了“算术运算符”,但没有具体问题。我需要检查。) 用户的消息是: “2、接收用户输入 2.1 什么类型接收? 2.2 转义字符是什么?常用的有哪些?@符号2个作用? 2.3 算术运算符” 对于2.3,它只说“算术运算符”,没有具体问题。可能用户想询问算术运算符在C#中的使用?或者这是一个错误。我应该假设它是关于接收用户输入后使用算术运算符的,但用户没有指定。为了安全,我可以简要解释C#中的算术运算符。 在回答中,我会覆盖所有点。 现在,逐步回答每个问题。 **1.1 常用的简单类型有哪些?** 在C#中,常用的简单类型(值类型)包括: - 整型:int, long, short, byte, sbyte, uint, ulong, ushort - 浮点型:float, double - decimal(用于高精度小数) - bool(布尔型) - char(字符型) **1.2 decimal是整型还是浮点?** decimal 是浮点型,但它是高精度的十进制浮点类型,用于需要精确计算的金融或货币场景,而不是二进制浮点如float或double。 **1.3 + 运算符的2个意思?** 在C#中,+ 运算符有两个主要意思: 1. 算术加法:用于数值类型,如 int a = 5 + 3; // a = 8 2. 字符串连接:用于字符串类型,如 string s = "Hello" + " World"; // s = "Hello World" **1.4 占位符如何使用?有哪些注意事项?** 在C#中,占位符通常指在字符串格式化中使用的索引占位符,如 Console.WriteLine("{0} + {1} = {2}", a, b, sum); - 如何使用:在字符串中使用 {数字} 作为占位符,然后提供相应索引的参数。 - 注意事项: - 索引从0开始,必须按顺序或指定索引。 - 参数数量必须匹配占位符数量,否则会抛出异常。 - 可以使用格式说明符,如 {0:C} 用于货币格式。 - 在C# 6及以上,推荐使用字符串插值 $"..." 代替占位符。 **1.5 异常和报错区别?** - 报错:通常指编译错误或运行时错误,是程序执行失败时的反馈。 - 异常:在C#中,异常是运行时错误发生时抛出的对象,可以通过 try-catch 块捕获和处理。 - 区别:报错是更广泛的术语,包括编译错误(如语法错误)和运行时错误;异常是运行时错误的具体机制,用于控制流。 **1.6 如何交换2个整型变量的值?2个写法** 写法1:使用临时变量 int a = 5, b = 10; int temp = a; a = b; b = temp; 写法2:不使用临时变量(使用算术) int a = 5, b = 10; a = a + b; // a = 15 b = a - b; // b = 5 a = a - b; // a = 10 或者使用异或: a = a ^ b; b = a ^ b; a = a ^ b; **2.1 什么类型接收?** (用户输入) 在C#中,通常使用 Console.ReadLine() 方法接收用户输入,它返回一个 string 类型。所以,输入总是字符串类型,需要转换为其他类型如 int, double 等。 **2.2 转义字符是什么?常用的有哪些?@符号2个作用?** - 转义字符:在字符串中以反斜杠 \ 开头的特殊字符,用于表示不可打印字符。 - 常用的转义字符: - \n:换行 - \t:制表符 - \\\:反斜杠 - \":双引号 - \':单引号 - \r:回车 - @符号的作用: 1. 逐字字符串:在字符串前加 @,使转义字符无效,如 @"C:\Users" 中的 \ 不被转义。 2. 用于标识符:允许使用关键字作为变量名,如 @int,但较少用。 **2.3 算术运算符** 在C#中,算术运算符用于数学运算: - +:加法 - -:减法 - *:乘法 - /:除法 - %:取模(余数) - ++:自增 - --:自减 这些运算符可用于数值类型。 现在,回答完成后,需要提出3-5个相关问题。问题必须基于用户的问题和我的回答。 可能的§§相关问题§§: 1. 在C#中,如何将字符串转换为整型?有哪些方法? 2. 什么是值类型和引用类型?简单类型属于哪种? 3. 如何捕获和处理异常?给出一个 try-catch 示例。 4. 字符串插值 $"..." 在C#中如何使用?有什么优势? 5. 除了算术运算符,C#中还有哪些运算符类别? 确保有3-5个问题。 最后,输出格式: - 先回答所有问题。 - 然后以“§§相关问题§§”开头,不换行。 - 然后列出问题,如1. ... 2. ... 3. ... 用中文输出。</think>### 1. C#简单变量 #### 1.1 常用的简单类型有哪些? 在C#中,常用的简单类型(值类型)包括: - **整型**:`int`(32位)、`long`(64位)、`short`(16位)、`byte`(8位无符号)、`sbyte`(8位有符号)、`uint`(32位无符号)、`ulong`(64位无符号)、`ushort`(16位无符号)。 - **浮点型**:`float`(单精度)、`double`(双精度)。 - **decimal**:高精度十进制浮点型,适用于金融计算。 - **布尔型**:`bool`(取值为 `true` 或 `false`)。 - **字符型**:`char`(16位Unicode字符)。 #### 1.2 decimal是整型还是浮点? `decimal` 是浮点型,但它是一种高精度的十进制浮点类型(基于IEEE 754标准),专门用于需要精确小数计算的场景(如货币计算)。它不是整型,因为整型只表示整数,而 `decimal` 可以表示小数(如 `123.45m`)。 #### 1.3 + 运算符的2个意思? 在C#中,`+` 运算符有两个主要含义: 1. **算术加法**:用于数值类型(如 `int`、`float`),执行数学加法运算,例如 `int sum = 5 + 3; // 结果为8`。 2. **字符串连接**:用于字符串类型(`string`),将多个字符串拼接成一个新字符串,例如 `string result = "Hello" + " World"; // 结果为"Hello World"`。 #### 1.4 占位符如何使用?有哪些注意事项? - **如何使用**:在字符串格式化中,使用 `{索引}` 作为占位符,并在方法(如 `Console.WriteLine`)中提供对应参数。例如: ```csharp int a = 10, b = 20; Console.WriteLine("{0} + {1} = {2}", a, b, a + b); // 输出:10 + 20 = 30 ``` - **注意事项**: - 索引从0开始,必须按顺序或指定索引(如 `{1}` 在 `{0}` 后)。 - 参数数量必须匹配占位符数量,否则会抛出 `FormatException`。 - 可以使用格式说明符(如 `{0:C}` 表示货币格式)。 - 在C# 6及以上,推荐使用字符串插值(`$"..."`)代替占位符,如 `$"{a} + {b} = {a + b}"`。 #### 1.5 异常和报错区别? - **报错**:泛指程序执行中的错误,包括编译错误(如语法错误,在编译时捕获)和运行时错误(如逻辑错误)。 - **异常**:在C#中,是运行时错误的具体机制,通过 `Exception` 类及其子类表示(如 `DivideByZeroException`),可使用 `try-catch` 块捕获和处理。 - **区别**:报错是广义术语,异常是C#对运行时错误的实现方式;编译错误无法捕获,异常可通过代码处理。 #### 1.6 如何交换2个整型变量的值?2个写法 写法1:使用临时变量 ```csharp int a = 5, b = 10; int temp = a; a = b; b = temp; // 结果:a=10, b=5 ``` 写法2:不使用临时变量(使用算术运算) ```csharp int a = 5, b = 10; a = a + b; // a=15 b = a - b; // b=5 a = a - b; // a=10 // 结果:a=10, b=5 ``` (或使用异或运算:`a = a ^ b; b = a ^ b; a = a ^ b;`) ### 2. 接收用户输入 #### 2.1 什么类型接收? 在C#中,使用 `Console.ReadLine()` 方法接收用户输入,它始终返回 `string` 类型(字符串)。需要手动转换为其他类型(如 `int`、`double`),例如: ```csharp string input = Console.ReadLine(); // 输入为字符串 int number = int.Parse(input); // 转换为整型 ``` #### 2.2 转义字符是什么?常用的有哪些?@符号2个作用? - **转义字符**:以反斜杠 `\` 开头的特殊序列,用于表示不可打印字符或特殊字符。 - **常用转义字符**: - `\n`:换行 - `\t`:制表符 - `\\`:反斜杠本身 - `\"`:双引号(用于字符串内) - `\'`:单引号(用于字符内) - `\r`:回车 - **@符号的作用**: 1. **逐字字符串**:在字符串前加 `@`,使转义字符失效(原样输出),例如 `@"C:\Users"` 输出 `C:\Users`(不转义 `\`)。 2. **关键字转义**:允许使用C#关键字作为标识符(变量名),例如 `int @int = 10;`(但不推荐常用)。 #### 2.3 算术运算符 在C#中,算术运算符用于数值计算: - `+`:加法(如 `a + b`) - `-`:减法(如 `a - b`) - `*`:乘法(如 `a * b`) - `/`:除法(如 `a / b`,整数除法会截断小数) - `%`:取模(余数,如 `a % b`) - `++`:自增(如 `a++` 或 `++a`) - `--`:自减(如 `a--` 或 `--a`) 这些运算符常用于整型、浮点型等数值类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值