2016-01-29 5 views
-1

Я пишу функцию с параметрами:Нахождение 2s п бит длина дополнить представление числа

int nbit2s(long int x, long int n){ 

} 

Ищу взять в 64-битном числа х, и найти, если 2 битное представление п длина бит. Тем не менее, мне ограничивается использование только побитовых операторов и исключение из использования таких операторов, как> = < =, а условные операторы

Например, nbit2s (5,3) возвращает 0, потому что представление невозможно.

Я не ищу для любого кода, но только идеи, до сих пор моя идея была:

  1. Возьмите число п и преобразовать его в это двоичное представление.
  2. сдвига влево двоичного 64-п раз, чтобы получить MSB и хранить, что в переменном сдвиге 3.Shift к правому 64-п, чтобы получить ведущий бит и магазин в смене
  3. XOR оригинального номер с W, если 1 затем TRUE, 0, затем FALSE.

Я чувствую, что это происходит по правильным линиям, но если кто-то может объяснить, возможно, лучший способ сделать это или какие-либо ошибки, которые я, возможно, сделал, это было бы здорово.

+2

'long int x' может быть только 32-битным. Рекомендуем 'long long' или' uint64_t'. – chux

+0

У меня создалось впечатление, что длинный int был 64 бит на машине Mac и хранился как 32 бит на машинах Windows. –

+1

Я чувствую, что вы делаете тот же курс: https://stackoverflow.com/questions/9122636/finding-how-many-bits-it-takes-to-represent-a-2s-complement-using-only-bitwise https://stackoverflow.com/questions/8204075/minimum-bits-required-for-twos-complement-number-representation – viraptor

ответ

2

Если я правильно понимаю ваш вопрос, вы бы хотели определить, будет ли целое число x представлено в виде двоичного числа с n или менее бит.

Простым способом проверки этого является использование побитового оператора И для маскировки всех битов выше максимального значения, а затем посмотреть, совпадает ли замаскированное целое число с оригиналом.

Пример:

bool nbit2s(uint64_t x, int n) { 
    return (x & (1ULL << n) - 1) == x; 
} 
+0

'1 << n' может не сдвигать 64 бита, поскольку' int 1' может быть узким. Лучше использовать '1ULL << n' или тому подобное – chux

+0

@chux Хороший улов - обновленный ответ –

+0

Это работает только для неподписанных номеров. Вопрос включает отрицательные. – viraptor

1

Раствор для положительных чисел было бы просто сдвинуть вправо на n. Если он по-прежнему не равен нулю, для его представления требуется более n бит.

Но поскольку аргумент подписан, и вы говорите о представлении с двумя дополнениями, вам, вероятно, придется использовать его как неподписанное представление, чтобы избежать расширения знака.