Mercurial > hg > octave-max
comparison src/bitfcns.cc @ 12045:42d51e66729b release-3-2-x
fix signed integer shift
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Sat, 25 Jul 2009 16:20:35 +0200 |
parents | 923c7cb7f13f |
children | cd96d29c5efa |
comparison
equal
deleted
inserted
replaced
12044:8dcae1dfc9a0 | 12045:42d51e66729b |
---|---|
379 #define DO_UBITSHIFT(T, N) \ | 379 #define DO_UBITSHIFT(T, N) \ |
380 do \ | 380 do \ |
381 { \ | 381 { \ |
382 int bits_in_type = octave_ ## T :: nbits (); \ | 382 int bits_in_type = octave_ ## T :: nbits (); \ |
383 T ## NDArray m = m_arg.T ## _array_value (); \ | 383 T ## NDArray m = m_arg.T ## _array_value (); \ |
384 octave_ ## T mask = ~0ULL; \ | 384 octave_ ## T mask = octave_ ## T::max (); \ |
385 if ((N) < bits_in_type) \ | 385 if ((N) < bits_in_type) \ |
386 mask = bitshift (mask, (N) - bits_in_type); \ | 386 mask = bitshift (mask, (N) - bits_in_type); \ |
387 else if ((N) < 1) \ | 387 else if ((N) < 1) \ |
388 mask = 0; \ | 388 mask = 0; \ |
389 DO_BITSHIFT (T); \ | 389 DO_BITSHIFT (T); \ |
393 #define DO_SBITSHIFT(T, N) \ | 393 #define DO_SBITSHIFT(T, N) \ |
394 do \ | 394 do \ |
395 { \ | 395 { \ |
396 int bits_in_type = octave_ ## T :: nbits (); \ | 396 int bits_in_type = octave_ ## T :: nbits (); \ |
397 T ## NDArray m = m_arg.T ## _array_value (); \ | 397 T ## NDArray m = m_arg.T ## _array_value (); \ |
398 octave_ ## T mask = -1; \ | 398 octave_ ## T mask = octave_ ## T::max (); \ |
399 if ((N) < bits_in_type) \ | 399 if ((N) < bits_in_type) \ |
400 mask = bitshift (mask, (N) - bits_in_type); \ | 400 mask = bitshift (mask, (N) - bits_in_type); \ |
401 else if ((N) < 1) \ | 401 else if ((N) < 1) \ |
402 mask = 0; \ | 402 mask = 0; \ |
403 mask = mask | octave_ ## T :: min (); /* FIXME: 2's complement only? */ \ | |
403 DO_BITSHIFT (T); \ | 404 DO_BITSHIFT (T); \ |
404 } \ | 405 } \ |
405 while (0) | 406 while (0) |
406 | 407 |
407 DEFUN (bitshift, args, , | 408 DEFUN (bitshift, args, , |