MFC Bitshift более 32 бит - PullRequest
       20

MFC Bitshift более 32 бит

1 голос
/ 09 марта 2011

У меня сейчас проблема с операторами битового сдвига.Я не знаком с этим, так что извините за глупый вопрос.

У меня есть следующий код ниже:

INT iBitShift = 82;
INT iMaxColumn = 82;
for ( iCol = 0; iCol < iMaxColumn; iCol++ ) {
    dwColumnBit = (dwNewBitmap >> iBitShift) & 0x01;

    if ( dwColumnBit ) {
        // do something..
    }
    iBitShift--;
}

Он работал нормально, когда iMaxColumn было меньше 30, но когда он стал82, проблема началась уже.Что происходит, когда iCol достигает 32 и 64, dwColumnBit больше не получает правильное значение.Что-то не так в моем коде?Я читал о круговых сдвигах, но не знаю, как это осуществить.

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 09 марта 2011

Когда вы пересекаете границу слова, вы теряете биты.

Похоже, вы хотите знать значение бита iBitShift.Вы можете сделать это, сначала найдя правильное слово (используя iBitShift/wordsize), а затем сдвинув остальные биты (используя iBitShift%wordsize):

template< typename T, int N >
bool bit( T (&words)[N], int iIndex ) {
    static const size_t bitsperword = 
      sizeof(T)*numeric_limits<unsigned char>::digits;
    // find proper word (assuming words[0] contains the first word)
    T word = words[ iIndex/bitsperword ];
    // shift the residue
    word >>= iIndex%bitsperword;
    return word & 0x1;        
}

int main(){
  int ints [] = {1,~0x0};
  for( int i = 0; i != sizeof(int)*sizeof(ints); ++i ) {
    printf("%d", bit(ints,i) ? 1:0);
  }
  return 0;
}
1 голос
/ 09 марта 2011

Из ваших соглашений об именах, я полагаю, вы пытаетесь выполнить сдвиги битов в DWORD.DWORD составляет 4 байта, что означает 32 бита (в 32-битном компьютере).Таким образом, когда вы сдвинете DWORD 32 раза, у вас будут все нули в DWORD.

Кроме того, ваше утверждение:

(dwNewBitmap >> iBitShift) & 0x01

пытается сдвинуть более 32 бит, так как iBitShift инициализируется с 82, что означает, что он не сможет сдвинуть 82 бита, учитывая, что естьтолько 32 бита, которые могут быть смещены вокруг.

Я надеюсь, что это проясняет поведение, которое вы считаете «странным».

РЕДАКТИРОВАТЬ: Основано на некоторой информации от OP В комментариях:

Похоже, растровое изображение хранится в виде двоичных данных в реестре.Вам нужно прочитать эти двоичные данные в байтовый массив, а затем разбить логику, чтобы выбрать только DWORD из этих данных за раз (сделать это в цикле), а затем проверить биты этого DWORD в цикле из 132. Таким образом, вы узнаете, какие биты установлены, а какие нет.

0 голосов
/ 10 марта 2011

Поскольку вы наконец-то признали, что действительно выполняете здесь обработку растровых изображений, вы можете также рассмотреть возможность использования std::bitset<82> для этой задачи. bitset также может конвертировать в string и обратно. Кроме того, он работает с enum!

enum column {
  colA, colB, ....
  , colMAX // keep this one last
};

bitset<colMAX> columnvisible;

columnvisible.set(colB);
columnvisible.reset(colA);

...
storeStringInRegistry( columnvisible.tostring() );

...
columnvisible = bitset<colMAX>( readStringFromRegistry() );

for( column c = colA; c != colMAX; ++c ) {
    if( columnvisible[c] ) displayColumn( c );
}

Хорошо, нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...