Java 两个数字相加的位运算?
所以如果我有一个1号和另一个2号。。这两个整数,我用位运算加两个数的方法正确吗?对于任何测试用例,这会出错吗Java 两个数字相加的位运算?,java,bit-manipulation,Java,Bit Manipulation,所以如果我有一个1号和另一个2号。。这两个整数,我用位运算加两个数的方法正确吗?对于任何测试用例,这会出错吗 public int add(int number1, int number2) { int carry = (number1&number2)<<1; int sum = number1^number2^carry; return sum; } public int add(int number1,int number2) { int carry=(number1
public int add(int number1, int number2)
{
int carry = (number1&number2)<<1;
int sum = number1^number2^carry;
return sum;
}
public int add(int number1,int number2)
{
int carry=(number1和number2)是。这种方法不适用于涉及多个进位的加法运算。最简单的这种情况是3+1
;您的函数结果是0
没有简单的通用解决方案可以解决这个问题——任何解决方案都必须考虑整数的宽度。有关一些方法,请参阅。
这里是一个电路设计者如何添加两个数字。翻译时,双弯曲左边缘上的两个符号是XOR(^),中间的两个具有平坦的左边缘是(和),最后一个具有左弯曲边的是(或)(<)/<
现在,下面是如何使用掩码将其转换为代码,一次一位
public int add(final int A, final int B) {
int mask = 1;
int sum = 0;
int carry = 0;
for (int i = 1; i <= Integer.SIZE; i++) { //JVM uses 32-bit int
int a = A & mask; //bit selection
int b = B & mask;
//sum uses |= to preserve the history,
//but carry does not need to, so it uses =
sum |= a ^ b ^ carry; //essentially, is the sum of bits odd?
carry = ((a & b) | ((a ^ b) & carry)) << 1; //are exactly two of them 1?
mask <<= 1; //move on to the next bit
}
return sum;
}
public int add(最终int A,最终int B){
int-mask=1;
整数和=0;
整数进位=0;
对于(inti=1;i是的,它会出错。我们可以使用while
循环。下面是代码
static int addTwoNumbers(int a, int b)
{
int carryNum;
while(b ! = 0)
{
carryNum = a & b;
a = a ^ b;
b = carryNum << 1;
}
return a;
}
静态整数addTwoNumber(整数a、整数b)
{
内角叉菜属;
而(b!=0)
{
carryNum=a&b;
a=a^b;
b=carryNum这是用JavaScript编写的,但现在开始
function add(number1,number2){
var a = number1,b = number2,c;
while(b != 0){
c = a & b;
a = a ^ b;
b = c << 1;
}
return a;
}
函数添加(number1,number2){
变量a=number1,b=number2,c;
而(b!=0){
c=a&b;
a=a^b;
b=c如果你插入一些非平凡的数字,你就会意识到这是错误的。加法器需要一个接一个地链接。(提示:你需要一个循环)你能举一个这两个数字的例子吗?3+1
,就像目前为止的答案一样。任何带有链式进位的数字都是错误的,63+1
,127+1
,等等。写一个单元测试,看看你自己。不工作。我检查了3和9,得到了12。另外,它对负+正都不工作。对正和负都有效如果翻译成python,测试超过500个值的负值在-12
和-8
上失败。您能证明您的方法产生正确的结果吗?