如何在JavaScript中添加两个数字;不使用+;`或“运算符”;?
我知道使用如何在JavaScript中添加两个数字;不使用+;`或“运算符”;?,javascript,algorithm,Javascript,Algorithm,我知道使用+符号进行加法的另一种方法是: int add(int a, int b) { if(b == 0) return sum; sum = a ^ b; carry = (a & b) << 1; return add(sum,carry); } 我们将使用,并且将使用 当我们有一些低资源时,我们使用这种方法 var getSum=函数(a,b){ 如果(b==0){ 返回a; }否则{ 返回getSum(
+
符号进行加法的另一种方法是:
int add(int a, int b)
{
if(b == 0)
return sum;
sum = a ^ b;
carry = (a & b) << 1;
return add(sum,carry);
}
我们将使用,并且将使用
当我们有一些低资源时,我们使用这种方法
var getSum=函数(a,b){
如果(b==0){
返回a;
}否则{
返回getSum(a^b,(a&b)好的,我回答的问题在标题中有清楚的描述。没有+
和没有-
操作对吗?但是…不是按位而是纯数学应该是一个有效的答案
var x=1,
y=2,
总和=数学对数2(2**x*2**y);
console.log(sum);
与@PatrickRoberts建议的方法相同,但没有递归:
const add = (a, b) => {
let c;
while (a !== 0) {
c = b & a;
b = b ^ a;
c = c << 1;
a = c;
}
return b;
};
const add=(a,b)=>{
让c;
而(a!==0){
c=b&a;
b=b^a;
c=c我们可以使用while循环实现相同的功能。我们必须将进位移到左边,并将其添加到二进制数和中,直到没有进位为止(我们按照惯例添加小数)
函数getSum(a,b){
而(b!=0){
var carry=a&b;//计算是否有需要添加的进位
a=a^b;//a用于保存总和
b=进位可以使用数组结构执行求和运算
function getSum(a, b){
return Array(a).concat(Array(b)).length / 100;
}
每个输入被强制为一个数组,例如,一个值为5的输入将被强制为一个包含5个元素的数组。强制两个输入后,数组被合并为一个数组。最后一个数组的长度通过除以100来处理十进制值之和返回
现在,让我们试着对无效的输入案例进行防御,例如字符串
或falsy值
const DEFAULT_NUMBER_VALUE = 0;
const DEFAULT_PRECISION = 100;
function parseAddInput(input){
if (!input) {
return DEFAULT_NUMBER_VALUE;
}
if (typeof input === 'string'){
input = parseInt(input);
}
const roundedNumber = Math.round(input * (10 * DEFAULT_PRECISION));
return roundedNumber;
}
function getSum(a, b){
return Array(
parseAddInput(a)
).concat(
Array(parseAddInput(b))
).length / 100;
}
function add(number1, number2){
return getSum(number1, number2);
}
你没有提供任何你尝试过的代码或示例。你本质上是将一个Comp Sci作业发布到stack overflow中,并要求我们为你解决它。你甚至链接到一个已经向你展示了方法的问题。关于stack overflow的任何问题都不会取代你自己的研究。要真正理解答案,你可以不要只是问我们“怎么做”解决这个问题。你必须尝试自己解决它,如果你陷入困境,提供代码和结果。看看并开始学习按位运算。它们在几乎所有语言中本质上都是相同的。然后回来问一个关于你陷入困境时编写的代码的具体问题。好的,算法是你复制了,你没有复制递归。…&
=按位和,@Microsmsm这被否决了,因为很明显你没有努力产生任何尝试,也没有阅读关于JS运算符的文档。const getSum=(a,b)=>b==0?a:getSum(a^b,(a&b)如果我们有负数,例如A=-1,b=1,那么第2点将失败。结果b 0应该为你的答案提供解释吗?试着说服我,在源代码中既没有+
也没有-
运算符的方法是不使用+
或-
运算符。使用eval应该更有效。const add=eval(unescape('(a,b)=>a%2b'))
接受的答案可能只处理32位整数。但是这个答案适用于所有数字(有一些浮点错误…。即使有一些浮点问题,这也是非常原始的:)我喜欢你的解决方案。可以使用a^=b;
而不是a=a^b;
function getSum(a, b){
return Array(a).concat(Array(b)).length / 100;
}
const DEFAULT_NUMBER_VALUE = 0;
const DEFAULT_PRECISION = 100;
function parseAddInput(input){
if (!input) {
return DEFAULT_NUMBER_VALUE;
}
if (typeof input === 'string'){
input = parseInt(input);
}
const roundedNumber = Math.round(input * (10 * DEFAULT_PRECISION));
return roundedNumber;
}
function getSum(a, b){
return Array(
parseAddInput(a)
).concat(
Array(parseAddInput(b))
).length / 100;
}
function add(number1, number2){
return getSum(number1, number2);
}