Это так же просто, как ((1u << a) - 1u) << b
, где a
- это число 1
с, а b
- это смещение.
Пример:
#include <iostream>
#include <bitset>
unsigned foo(unsigned size, unsigned offset)
{
return ((1u << size) - 1u) << offset;
}
int main()
{
unsigned x = foo(5, 3);
std::cout << std::bitset<16>(x); // 0000000011111000
}
Попробуй жить
Этот подход нарушается, если a (or b) >= sizeof(unsigned) * CHAR_BIT
(спасибо @Deduplicator)
Если после переключения на самый большой из доступных интегральных типов проблема остается, вы можете добавить некоторые проверки безопасности:
#include <iostream>
#include <bitset>
#include <climits>
unsigned foo(unsigned size, unsigned offset)
{
unsigned x = 0;
if (offset >= sizeof x * CHAR_BIT)
return 0;
if (size < sizeof x * CHAR_BIT)
x = 1u << size;
return (x - 1u) << offset;
}
int main()
{
unsigned x = foo(32, 3);
std::cout << std::bitset<32>(x);
}