-2

В R книге K & в главе 2.9, я застрял на понимании этой функции выборки getbits()K & R: Потребность Объяснение в понимании этого C код

getbits(x,p,n) 

Возвращает (правый скорректированные) н-бит поле x, которое начинается в позиции p. Вот тело функции

/* getbits: get n bits from from position p */ 
unsigned getbits(unsigned x, int p, int n) 
{ 
    return (x >> (p+1-n)) & ~(~0 << n); 
} 

Я на самом деле не сталкивается с проблемами побитовых операторов, но я не могу на самом деле получить этот вопрос. Я застрял в понимании вопроса, в основном, не решая его. В конечном счете «Что нам нужно найти в этой функции».

+1

Вы можете найти этот инструмент полезным: HTTP: //bitwisecmd.com/ – WhiZTiM

+3

в ANSI C этот код является неопределенным поведением, поэтому не беспокойтесь об этом слишком много. –

+0

@ Батшеба, пожалуйста, откройте вопрос, я задал этот вопрос, потому что ответы на другой вопрос меня не удовлетворили –

ответ

1

Он просто сдвигает бит прямо на p+1-n бит (чтобы сделать нужное поле правомерным), затем маскирует все, кроме нижнего n бит. Вот расширенная версия, которая может быть понятнее:

unsigned getbits(unsigned x, int p, int n) 
{ 
    unsigned x_right = (x >> (p+1-n)); // shift right to make required bits right-justified 
    unsigned mask = ~(~0 << n);  // create n bit mask 
    return x_right & mask;    // return required bits 
} 
+0

, пожалуйста, вы можете объяснить это с помощью примера. Я думаю, что я начинаю понимать его. –

+0

Что делать, если x больше, чем p + 1-n –

+1

@Some_Random_Programmer. Почему бы вам не придумать пример и попробовать? Затем мы можем сказать вам, что вы ошибаетесь. –

0

Рисование двоичного представления обычно помогает в таких случаях.

Например: принимать 3 бита из положения 5:

X: 101010101 
    --^ 
     p 

Это сдвигает:

X: 1010 
    ^
     p 

А потом маски:

X: 010 
    --^ 
     p 
Смежные вопросы