Lintcode a+b
原题要求给出两个数,返回它们的和,不能使用+运算符,但是可以使用位运算符。由于对位运算不熟悉,我首先想到的是利用函数将两个数分别化成补码形式,保存在两个数组中,然后按照补码加法串行运算器的逻辑形式实现。即:
位运算
位运算一共有七种,分别是
运算 | c语言中的运算符 |
---|---|
按位与 | & |
按位或 | | |
按位异或 | ^ |
按位取反 | ~ |
左移 | << |
带符号右移 | >> |
不带符号右移 | \ |
/********************正确版本*************************/
int aplusb(int a, int b) {
// write your code here
while(b!=0){
int b_=(a&b)<<1;
int a_=a^b;
b=b_;
a=a_;
}
return a;
}
/******************错误版本***********************/
int aplusb(int a, int b) {
// write your code here
int xor,xand;
xor=a^b;
xand=a&b<<1;
while(xand!=0){
a=xor;
b=xand;
xor=a^b;
xand=a&b<<1;
}
a=xor;
return a;
}
第一次写,报了一个有关xor的错,猜测可能是保留字或者函数名,所以改成了以下版本
/******************错误版本***********************/
int aplusb(int a, int b) {
// write your code here
int xo1,xand;
xo1=a^b;
xand=a&b<<1;
while(xand!=0){
a=xo1;
b=xand;
xo1=a^b;
xand=a&b<<1;
}
a=xo1;
return a;
}
返回Wrong Answer, 测试了几组数据,没搞清楚错在哪里,对比之后发现,在(a&b)<<1
这里,没有加括号,查询优先级表之后发现
优先级 | 运算符 | 结合律 |
---|---|---|
1 | 后缀运算符:[] () · -> ++ --(类型名称){列表} | 从左到右 |
2 | 一元运算符:++ – ! ~ + - * & sizeof_Alignof | 从右到左 |
3 | 类型转换运算符:(类型名称) | 从右到左 |
4 | 乘除法运算符:* / % | 从左到右 |
5 | 加减法运算符:+ - | 从左到右 |
6 | 移位运算符:<< >> | 从左到右 |
7 关系运算符:<<= >>= | 从左到右 | |
8 | 相等运算符:== != | 从左到右 |
9 | 位运算符 AND:& | 从左到右 |
10 | 位运算符 XOR:^ | 从左到右 |
11 | 位运算符 OR:| | 从左到右 |
12 | 逻辑运算符 AND:&& | 从左到右 |
13 | 逻辑运算符 OR:|| | 从左到右 |
14 | 条件运算符:?: \从右到左 | |
\15 \赋值运算符: = += -= *= /= %= &= ^= |= <<= >>= | 从右到左 | |
16 | 逗号运算符:, | 从左到右 |
参考: