bit manipulation - Move integer to the nearest divisible by 4 in C++ -
i'd move integer nearest 'divisible 4' number in c++, not if number divisible 4. here's best attempt, i'm sure suboptimal:
offset = (offset & 3) ? (offset | 3) +1 : offset;
there must surely fast way of doing doesn't include tertiary if statement?
additional note: in case offset 32-bit int.
offset = (offset + 3) & ~(decltype(offset))3;
or
#include <type_traits> // ... offset = (offset + 3) & ~static_cast<std::remove_reference<decltype(offset)>::type>(3);
if need support possibility offset
reference type, such size_t&
. @baummitaugen.
it seems work when offset
wider int
without type cast, offset = (offset + 3) & ~3;
, uncertain whether or not mandated language standard.
this algorithm can described in english "add 3 round down".
the rounding down part done setting 2 least significant bits 0 binary arithmetics. unsetting of bits done applying binary , inverse bit pattern, in other words make bit pattern of bits value want keep unchanged , apply mask.
binary representation of 3
: 00000011
we inverse bit mask ~
(bitwise not, not confused !
logical not) operator: ~3
for ~
operator, size of operand determines size of result, on machine ~(unsigned char)3 == 252
(1111 1100
) , ~(unsigned int)3 == 4294967292
(1111 1111 1111 1111 1111 1111 1111 1100
). default size integer literal int
.
when offset
wider type (has more bits) int
, need operand ~
widened bitmask matches. why cast literal 3
same type offset
.
Comments
Post a Comment