Вращающиеся биты с использованием оператора sizeof - PullRequest
1 голос
/ 20 января 2010

Я пытаюсь написать небольшую функцию ротатора, и я пытаюсь получить больше разъяснений относительно оператора sizeof. Так как я не знаю, какой тип числового объекта мне нужно вращать, я предполагаю, что мне нужно использовать оператор sizeof для

unsigned rotator(unsigned object, int count)

это прототип функции, где объект - это объект, который нужно повернуть, а count - это количество битов, которые необходимо переместить. Я представляю себе, что если бы у меня было 8-битное число, я сначала определил бы фактическое число вращаемых битов (поскольку человек может, например, сделать число = 20, поэтому я бы сделал что-то вроде:

int actualBitRotation;
if (count > sizeof(object)) {
    actualBitRotation = count % sizeof(object);

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

int actualBitRotation;
if (count > (sizeof(object) * CHAR_BIT) {
    actualBitRotation = count % (sizeof(object) * CHAR_BIT);
}

Спасибо!

Ответы [ 2 ]

3 голосов
/ 20 января 2010

sizeof () действительно возвращает количество байтов, поэтому вам нужно умножить на CHAR_BIT, чтобы получить количество бит.переменная;результаты зависят от процессора и компилятора.

0 голосов
/ 13 сентября 2011

как насчет:

union hack {
    int asSigned;
    unsigned asUnsigned;
};
hack top, bottom;
int realBitCount = count % (sizeof(T)*8);
top.asSigned = (realBitCount == 0) ? 0 : -(1 << (realBitCount-1));
bottom.asUnsigned = 0xFFFFFFFF ^ top.asUnsigned;

top.asUnsigned &= object;
bottom.asUnsigned &= object;
return static_cast<T>( (bottom.asUnsigned << realBitCount) | (top.asUnsigned >> (sizeof(T)-realBitCount)) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...