Я знаю, что это общая проблема, и я не могу понять, почему у меня так много проблем. Я пытаюсь преобразовать строку из кода 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 в двоичную форму перед сдвигом. Это правильно? И если да, то как мне это исправить?
Заранее спасибо!
<< сдвигается влево. Если B изначально равно 255 (двоичный 11111111) и вы сдвигаете его на один влево, вы получаете 111111110 (на большинстве машин значение int имеет ширину 32 бита, поэтому для этого 0 есть место), что составляет 510 в десятичном виде.
Итак, эта программа работает на 100% правильно.
Если вы хотите, чтобы он «отрубался», старшие биты делают b типом 8-битной ширины, таким как char, или AND с 0xFF.
Кажется, вы хотите очистить младший значащий бит.
Оператор левого смещения <<
не делает этого
В этом случае вы можете сделать следующее:
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
….