fork download
  1. #include <iostream>
  2. #include <bitset>
  3.  
  4. #include <stdint.h>
  5.  
  6. #define PRINT_BINARY(value) std::cout << std::bitset<32>(value) << " = " << value << std::endl
  7.  
  8. uint32_t FillUntilHighestBit(uint32_t value)
  9. {
  10. value |= (value >> 1);
  11. value |= (value >> 2);
  12. value |= (value >> 4);
  13. value |= (value >> 8);
  14. value |= (value >> 16);
  15.  
  16. return value;
  17. }
  18.  
  19. uint32_t InSingleExpression(uint32_t value)
  20. {
  21. return (value |= (value |= (value |= (value |= (value |= (value >> 1)) >> 2) >> 4) >> 8) >> 16);
  22. }
  23.  
  24. ///////////////////////////////////////////////////////////////////////////
  25. // StackOverflow solution provided by 'Dave', here:
  26. // http://stackoverflow.com/a/15466798/1177073
  27.  
  28. /*constexpr*/ uint32_t priv_RShiftAndOR(uint32_t value, size_t shift) {
  29. return (value >> shift) | value;
  30. }
  31.  
  32. /*constexpr*/ uint32_t constexpr_FillUntilHighestBit(uint32_t value) {
  33. return
  34. priv_RShiftAndOR(
  35. priv_RShiftAndOR(
  36. priv_RShiftAndOR(
  37. priv_RShiftAndOR(
  38. priv_RShiftAndOR(value,1)
  39. ,2)
  40. ,4)
  41. ,8)
  42. ,16);
  43. }
  44.  
  45. // End of StackOverflow solution. Thanks, Dave!
  46. ///////////////////////////////////////////////////////////////////////////
  47.  
  48. int main()
  49. {
  50. uint32_t value = 536887296;
  51. PRINT_BINARY(value);
  52.  
  53. PRINT_BINARY(FillUntilHighestBit(value));
  54. PRINT_BINARY(InSingleExpression(value));
  55. PRINT_BINARY(constexpr_FillUntilHighestBit(value));
  56.  
  57. return 0;
  58. }
Success #stdin #stdout 0s 3032KB
stdin
Standard input is empty
stdout
00100000000000000100000000000000 = 536887296
00111111111111111111111111111111 = 1073741823
00111111111111111111111111111111 = 1073741823
00111111111111111111111111111111 = 1073741823