Возврат числа дополнения к наиболее отрицательным двум в C с побитовыми операторами - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть функция в C, которая должна возвращать самый отрицательный номер дополнения до двух:

int mostNegTwosComp(void) {

    return 0;
}

Я ограничен использованием максимум 4 побитовых операторов.Эти операторы включают в себя: ! ~ & ^ | + << >>.Как бы я поступил так?Разве номер компаса самого отрицательного числа не будет зависеть от того, сколько бит выбрано?Например, 10000 будет самым отрицательным числом двух 16-разрядного целого числа?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Если вам не нужна переносимая версия, вы можете злоупотреблять информацией о том, что целые числа почти всегда равны 4 байтам.

return 0x80000000;

На самом деле, если вы знаете размер типа, который вы собираетесь вернуть, вы можете пропустить побитовую игру и обмануть в формате:

  1. In 0x__каждое число равно 4 битам. Это означает, что 2 цифры представляют собой один байт.
  2. Вы хотите, чтобы первый бит был равен 1, а все остальные биты были равны 0.
  3. 0x8 = 0b1000
  4. Таким образом, вы можете представить значение в виде 0x80 + 2 '0 для каждого байта типа после первого.

Но для ответа на остальную часть вашего вопроса.

Как бы я поступил так?

Если вы используете шаблоны, вы (вероятно) использовали бы побитовый трюк, который предлагает другой ответ.В противном случае вы можете обмануть с помощью приведенного выше кода или использовать определение из limit.h (iirc).

~ (~0u >> 1);

Было бы портативным решением.

Не будет ли число отрицательных двух чисел зависеть от того, сколько бит выбрано число?

Самый отрицательный комплимент двух зависит от размера содержащей переменную, поэтому я полагаю, вы могли бы сказать «выбранное число».Фактически диапазон значений зависит от размера содержащейся переменной.

Например, 10000 будет номером с самым отрицательным числом в 16-битном целом числе?

Для 16 битов значение с самым отрицательным значением двух будет равно 0x8000, 0b1000000000000000 или -32768, в зависимости от того, как вы хотите, чтобы он представлялся.

0 голосов
/ 05 февраля 2019
return ~ (~0u >> 1);

~ включает все биты в нуле unsigned.Затем >> 1 сдвигается вправо, в результате чего старший бит становится равным нулю.Затем ~ инвертирует все биты, производя один в старшем бите и ноль в остальных.

Затем return преобразует это в int.Это имеет поведение, определяемое реализацией, но присвоения классов такого рода обычно предполагают поведение, подходящее для упражнения.

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