Вы можете сделать это по-другому:
auto drop_bits_1_16(unsigned int number)
{
unsigned number1 = number & 0x7FFF0000; // number1 becomes: 0bcdefgh ijklmnop 00000000 00000000
unsigned number2 = number & 0x00007FFF; // number2 becomes: 00000000 00000000 0rstuvwx yzABCDEF
number1 = number1 >> 1; // number1 becomes: 00bcdefg hijklmno p0000000 00000000
return number1 | number2; // returns 00bcdefg hijklmno prstuvwx yzABCDEF
}
Это короче и имеет преимущество в том, что оно более читабельно: понятно, какие биты выбрасываются из битовых масок.
Вы также можетесделать его однострочным:
auto drop_bits_1_16(unsigned int number)
{
return ((number & 0x7FFF0000) >> 1) | (number & 0x00007FFF);
// Or, relying on operator precedence:
// return (number & 0x7FFF0000) >> 1 | number & 0x00007FFF;
}
Что, возможно, более понятно, чем то, что ваше решение становится однострочным:
auto drop_bits_1_16(unsigned int number)
{
return ((number << 1) & 0xFFFE0000) | (((number << 1) & 0x0000FFFF) << 1);
// Or, relying on operator precedence:
// return number << 1 & 0xFFFE0000 | (number << 1 & 0x0000FFFF) << 1;
}
Или, как предложено @greybeard (новсе еще, возможно, менее ясно):
auto drop_bits_1_16(unsigned int number)
{
return ((number << 1) & 0xFFFE0000) | ((number << 2) & 0x0001FFFC);
// Or, relying on operator precedence:
// return number << 1 & 0xFFFE0000 | number << 2 & 0x0001FFFC;
}