Деление на степень 2 с округлением до нуля - PullRequest
0 голосов
/ 25 сентября 2010

Мне нужно вычислить число (a / (2 ** b), используя только побитовые операторы, такие как! & ^ ~ И сдвиги. Мне дали следующий совет, но я новичок в C, и я не знаю, чтокод означает:

int bias = x>0 ? 0 : ((1<<n)-1);

Кто-нибудь может мне это объяснить?

Я думал, что a >> b будет работать, но я не думаю, что это работает для отрицательных чисел.

Ответы [ 3 ]

3 голосов
/ 25 сентября 2010

Этот конкретный бит кода дает вам смещение 0, если х положительно.В противном случае он создает маску из младших n битов.Шаблон x = a ? b : c; называется троичным оператором (технически, по-видимому, условным оператором) в C.

n      (1<<n)    (1<<n)-1     binary
0        0x01       0x00     00000000
1        0x02       0x01     00000001
2        0x04       0x03     00000011
3        0x08       0x07     00000111
4        0x10       0x0F     00001111
5        0x20       0x1F     00011111
6        0x40       0x3F     00111111
7        0x80       0x7F     01111111
           ...
0 голосов
/ 23 января 2014

Вздох ... это домашнее задание.Студент просит помочь с заданием из «Компьютерных систем», учебника для программистов.

Для дальнейшего использования, каждый раз, когда кто-то говорит: «Мне разрешено использовать только операторы XYZ, чтобы что-то делать»это, вероятно, вопрос домашней работы.

Я не думаю, что есть способ отнять репутацию у людей, которые обращаются за помощью с домашними вопросами, не так ли?

0 голосов
/ 05 октября 2010

хорошо, x<<n правильно работает для положительных чисел.так почему бы вам просто не использовать что-то вроде result=if sign=1 then (x<<n) else(-x<<n) (замените iftehenelse на какое-нибудь маскирование битом знака)

...