Полное раскрытие информации, это проблема домашней работы, и мне не нужен точный код. Мне поручено воспроизвести следующий код, используя только ~ & + < <.Поверните 0 бит в 1 бит, если бит находится между низким и высоким
int result = 0;
int i;
for(i = lowbit; i <= highbit; i++)
result |= 1 << i;
return result;
Где lowbit
и highbit
являются параметрами между 0
и 31
включительно. Если lowbit
это больше, чем число highbit
, вернуть 0.
То, что я попытался так как для следующего код
int result = 0;
int negone = ~0x0;
int first = 1 << (lowbit + negone); //the first 1 bit is at the lowbit th location
int last = 1 << (highbit + negone); //the last 1 bit is at the highbit th location
int tick = ~(first + last); //attempting to get all bits in the range of low and highbit.
result = ~(~first & ~tick); //bitwise | without using |
result = ~(~last & ~result);
return result + 1; //the first bit should always be on.
Так есть что-то фундаментальное я здесь отсутствует? В дополнение к тому, что я не работаю, это также распространяется на мой лимит из 12 операторов, которые мне разрешено использовать, но я бы хотел попробовать и заставить его работать, прежде чем я даже начну ограничивать операторов.
Когда я запускаю тестовый сценарий, я получаю ошибки в большинстве тестов, в том числе lowbit
и highbit
равны друг другу. Случаи, где максимальный размер highbit
и lowbit
- это наименьший размер, похоже, работает.
Любая помощь будет высоко оценена.
Итак, мне нужно было бы сделать allones без знака так, чтобы он использовал логический сдвиг вправо, чтобы 0 из битов слева от моего highbit? Большое спасибо за помощь, которая имеет большой смысл. –
Ваши учителя заставляют вас также использовать целые числа со знаком? – 2501
@ 2501 no Я могу определить локальные переменные, как мне кажется. –