Сдвиг влево конкретного нет. из 1с конкретного №. времен - PullRequest
0 голосов
/ 25 августа 2018

Я бы хотел сдвинуть влево конкретный номер.из них конкретного нет.раз.Я пытаюсь что-то вроде этого

//Left shift 3 1's by 5. 
int a = 0; 
a = 0b(111 << 5) ;  //Error : unable to find numeric literal
                    // operator 'operator""b'        
std::cout << a; //Should be 224

Любые предложения о том, как я могу исправить выше?В идеале я хотел бы что-то вроде этого

int a = 0;
int noOfOnes = 3;
a = 0b(noOfOnes << 5);

Я не уверен, как бы я достиг вышеизложенного в C ++?

1 Ответ

0 голосов
/ 25 августа 2018

Это так же просто, как ((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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...