How to add integers without correction?
4 次查看(过去 30 天)
显示 更早的评论
when using integer class such as int8 in matlab, and some calculation result is bigger than the upper range (for int8 , the upper range is 127), matlab would automatically set the value to the maximum.
eg.
a=int8(126);
b=int8(2);
c=a+b; % matlab would gives c=127, since 128 exceed the upper range of int8
but in some cases, i want to get a negetive result, like many programming languages do
i want c to be -128 because 01111110+00000010=10000000 and it's -128 for int8
this could be done by a "bitadd" like
function int1 = bitadd(int1,int2)
while (int2 ~=0)
carry=bitand(int1,int2);
int1=bitxor(int1,int2);
int2=bitshift(carry,1);
end
end
however this is very inefficient, since a while loop in the function
Setting the result to maximum should be additional correction, so is there a faster method to do bitwise add without such correction?
0 个评论
采纳的回答
Jan
2021-9-14
a = int8(126);
b = int8(2);
tic
for k = 1:1e4
c = bitadd1(a, b);
end
toc
tic
for k = 1:1e4
c = bitadd2(a, b);
end
toc
function int1 = bitadd1(int1,int2)
while (int2 ~=0)
carry = bitand(int1,int2);
int1 = bitxor(int1,int2);
int2 = bitshift(carry,1);
end
end
function c = bitadd2(a, b)
m = typecast(int16(a) + int16(b), 'int8');
c = m(1);
end
3 个评论
Jan
2021-9-23
It will be much faster to use int16 in general and crop the higher bits during the addition. In my tests this is 10 times faster, but I did not get the correct results when the overflow appears.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!