How to add integers without correction?
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Dejia Kong
el 14 de Sept. de 2021
Comentada: Jan
el 23 de Sept. de 2021
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 comentarios
Respuesta aceptada
Jan
el 14 de Sept. de 2021
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 comentarios
Jan
el 23 de Sept. de 2021
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.
Más respuestas (0)
Ver también
Categorías
Más información sobre Logical en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!