2015-01-23 2 views
0

У меня проблемы с побитовой манипуляцией.Гнездо наиболее значимого куска

Для: шестнадцатеричное значение наиболее значимых клев х равно у (предположим, что 0 = < < у = 15)

Ограничения: тесты не могут использовать равенство (==) или неравенства (! =) , операторы относительного сравнения, деление, модуль и умножение, условные обозначения.

Проблема: мне нужно сделать свою функцию так, чтобы при msb = y она возвращала 1, а если это не правда 0. Однако я продолжаю получать нуль, даже когда я запускаю его с помощью 0xff. Если бы кто-то мог указать мне в правильном направлении, это было бы здорово. Спасибо.

int sig_nib(int x, int y){ 

int shifright = x >> 27; 
int result = shifright & y; 

return (result^y); 
} 
+0

Самый значительный nibble int содержит бит знака, вы уверены, что его сравнить с y? –

+0

Да, пример будет 0xABCDEF01, где y = C, поэтому false, потому что это не msn. Хотя y = A будет истинным, так как это то же самое, что и msn. Поэтому по существу я хочу сравнить 4 бита y и 4 бита msn, чтобы определить, являются ли они одинаковыми. Ну, вот как я считаю, что в любом случае нужно подходить. – Rbutler93

ответ

2

Глупые ограничения. Кто нарушил ваш компилятор?

Что-то вроде этого следует сделать это:

bool sig_nib(int x, int y) 
{ 
    const int top4 = (x >> 28) & 0xf; 
    return !(top4^y); 
} 

Он использует логическую инверсию (!) повторно интерпретировать целочисленный результат от побитового-исключающего.

+0

Я полностью забыл о булевом типе. Спасибо, теперь это имеет гораздо больше смысла. – Rbutler93