язык программирования idl — Как сместить бит целочисленного значения в переполнении стека

Я знаю, что это общая проблема, и я не могу понять, почему у меня так много проблем. Я пытаюсь преобразовать строку из кода IDL в C ++

IDL:

for i = 0,7 do begin

b = ishfy(b,1)
print,b

endfor

Мой код C ++:

    for(int i = 0; i < 7; i++)
{
b = b << 1;
cout << b;
}

Мой начальный b 255, и я ожидаю получить 254, 252 и т. Д. Вместо этого мой первый битовый сдвиг возвращает 510. Я предполагаю, что моя проблема не заключается в преобразовании b в двоичную форму перед сдвигом. Это правильно? И если да, то как мне это исправить?

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

4

Решение

<< сдвигается влево. Если B изначально равно 255 (двоичный 11111111) и вы сдвигаете его на один влево, вы получаете 111111110 (на большинстве машин значение int имеет ширину 32 бита, поэтому для этого 0 есть место), что составляет 510 в десятичном виде.

Итак, эта программа работает на 100% правильно.

Если вы хотите, чтобы он «отрубался», старшие биты делают b типом 8-битной ширины, таким как char, или AND с 0xFF.

5

Другие решения

Кажется, вы хотите очистить младший значащий бит.
Оператор левого смещения << не делает этого

В этом случае вы можете сделать следующее:

for(int i = 0; i < 7; i++)
{
b &= (b - 1);
cout << b;
}

Так что у тебя есть:

1st it: 11111111 & 11111110 = 11111110 = 254
2nd it: 11111110 & 11111101 = 11111100 = 252
3rd it: 11111100 & 11111011 = 11111000 = 248
4th it: 11111000 & 11110111 = 11110000 = 240

….

1

По вопросам рекламы [email protected]