我的作业/项目中有一个问题,仅使用位移和逻辑运算符将 1 添加到无符号整数。函数中不应有任何“+”、“-”、“*”或“/”符号。
我从最后几天开始尝试,但还没有成功。到目前为止,我已经尝试了以下方法:
int A = (((B&C)<<1)^(B^C))
谁能帮我解决这个问题。?
你可以用任何编程语言帮助我。
我的作业/项目中有一个问题,仅使用位移和逻辑运算符将 1 添加到无符号整数。函数中不应有任何“+”、“-”、“*”或“/”符号。
我从最后几天开始尝试,但还没有成功。到目前为止,我已经尝试了以下方法:
int A = (((B&C)<<1)^(B^C))
谁能帮我解决这个问题。?
你可以用任何编程语言帮助我。
unsigned int i = ...;
unsigned int mask = 1;
while (i & mask)
{
i &= ~mask;
mask <<= 1;
}
i |= mask;
爪哇:
public static int inc(int i){
if ((i & 1) == 0)
return i | 1;
else
return inc(i>>1)<<1;
}
PS while henrik的循环变体显然更快
试试这个:
int n = 3;
n = abs(~n);
std::cout << n;
~n = -(n+1)
[~
用于按位补码]。(n + 1)
是由于在 2 的补码转换中加了 1。
(x + 1)
再次获得应用否定。因此,最终表达式变为abs(~x)
。
在不使用算术运算符的情况下自增的逻辑(+, -. * and /
)
unsinged int no = 3; //actual number
unsigned int one = 1;
unsigned int ans = 0;
unsigned int carry = 0;
unsigned int prev_ans = 0;
unsigned int prev_carry = 0;
ans = no ^ one;
carry = no & one;
while (carry != 0)
{
carry <<= 1;
prev_ans = ans;
prev_carry = carry;
ans = prev_ans ^ prev_carry;
carry = prev_ans & prev_carry;
}
Google for Full Adder并尝试实现一个。
这太容易了,例如在 Haskell 中:
data Unsigned = Zero | Succ Unsigned
increment :: Unsigned -> Unsigned
increment u = Succ u
没有位或算术运算符,根本没有运算符!