#include <iostream>
#include <bitset>
#include <stdint.h>
#define PRINT_BINARY(value) std::cout << std::bitset<32>(value) << " = " << value << std::endl
uint32_t FillUntilHighestBit(uint32_t value)
{
value |= (value >> 1);
value |= (value >> 2);
value |= (value >> 4);
value |= (value >> 8);
value |= (value >> 16);
return value;
}
uint32_t InSingleExpression(uint32_t value)
{
return (value |= (value |= (value |= (value |= (value |= (value >> 1)) >> 2) >> 4) >> 8) >> 16);
}
///////////////////////////////////////////////////////////////////////////
// StackOverflow solution provided by 'Dave', here:
// http://stackoverflow.com/a/15466798/1177073
/*constexpr*/ uint32_t priv_RShiftAndOR(uint32_t value, size_t shift) {
return (value >> shift) | value;
}
/*constexpr*/ uint32_t constexpr_FillUntilHighestBit(uint32_t value) {
return
priv_RShiftAndOR(
priv_RShiftAndOR(
priv_RShiftAndOR(
priv_RShiftAndOR(
priv_RShiftAndOR(value,1)
,2)
,4)
,8)
,16);
}
// End of StackOverflow solution. Thanks, Dave!
///////////////////////////////////////////////////////////////////////////
int main()
{
uint32_t value = 536887296;
PRINT_BINARY(value);
PRINT_BINARY(FillUntilHighestBit(value));
PRINT_BINARY(InSingleExpression(value));
PRINT_BINARY(constexpr_FillUntilHighestBit(value));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Yml0c2V0PgoKI2luY2x1ZGUgPHN0ZGludC5oPgoKI2RlZmluZSBQUklOVF9CSU5BUlkodmFsdWUpIHN0ZDo6Y291dCA8PCBzdGQ6OmJpdHNldDwzMj4odmFsdWUpIDw8ICIgPSAiIDw8IHZhbHVlIDw8IHN0ZDo6ZW5kbAoKdWludDMyX3QgRmlsbFVudGlsSGlnaGVzdEJpdCh1aW50MzJfdCB2YWx1ZSkKewogICAgdmFsdWUgfD0gKHZhbHVlID4+IDEpOwogICAgdmFsdWUgfD0gKHZhbHVlID4+IDIpOwogICAgdmFsdWUgfD0gKHZhbHVlID4+IDQpOwogICAgdmFsdWUgfD0gKHZhbHVlID4+IDgpOwogICAgdmFsdWUgfD0gKHZhbHVlID4+IDE2KTsKICAgIAogICAgcmV0dXJuIHZhbHVlOwp9Cgp1aW50MzJfdCBJblNpbmdsZUV4cHJlc3Npb24odWludDMyX3QgdmFsdWUpCnsKCXJldHVybiAodmFsdWUgfD0gKHZhbHVlIHw9ICh2YWx1ZSB8PSAodmFsdWUgfD0gKHZhbHVlIHw9ICh2YWx1ZSA+PiAxKSkgPj4gMikgPj4gNCkgPj4gOCkgPj4gMTYpOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gIFN0YWNrT3ZlcmZsb3cgc29sdXRpb24gcHJvdmlkZWQgYnkgJ0RhdmUnLCBoZXJlOgovLyAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTU0NjY3OTgvMTE3NzA3MwoKLypjb25zdGV4cHIqLyB1aW50MzJfdCBwcml2X1JTaGlmdEFuZE9SKHVpbnQzMl90IHZhbHVlLCBzaXplX3Qgc2hpZnQpIHsKICAgIHJldHVybiAodmFsdWUgPj4gc2hpZnQpIHwgdmFsdWU7Cn0KCi8qY29uc3RleHByKi8gdWludDMyX3QgY29uc3RleHByX0ZpbGxVbnRpbEhpZ2hlc3RCaXQodWludDMyX3QgdmFsdWUpIHsKICAgIHJldHVybgogICAgcHJpdl9SU2hpZnRBbmRPUigKICAgICBwcml2X1JTaGlmdEFuZE9SKAogICAgICBwcml2X1JTaGlmdEFuZE9SKAogICAgICAgcHJpdl9SU2hpZnRBbmRPUigKICAgICAgICBwcml2X1JTaGlmdEFuZE9SKHZhbHVlLDEpCiAgICAgICAsMikKICAgICAgLDQpCiAgICAgLDgpCiAgICAsMTYpOwp9CgovLyAgRW5kIG9mIFN0YWNrT3ZlcmZsb3cgc29sdXRpb24uIFRoYW5rcywgRGF2ZSEKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgppbnQgbWFpbigpCnsKICAgIHVpbnQzMl90IHZhbHVlID0gNTM2ODg3Mjk2OwogICAgUFJJTlRfQklOQVJZKHZhbHVlKTsKICAgIAogICAgUFJJTlRfQklOQVJZKEZpbGxVbnRpbEhpZ2hlc3RCaXQodmFsdWUpKTsKICAgIFBSSU5UX0JJTkFSWShJblNpbmdsZUV4cHJlc3Npb24odmFsdWUpKTsKICAgIFBSSU5UX0JJTkFSWShjb25zdGV4cHJfRmlsbFVudGlsSGlnaGVzdEJpdCh2YWx1ZSkpOwogICAgCiAgICByZXR1cm4gMDsKfQ==