2011-07-30 7 views
0

Я работаю над кодом на C++. Не очень уверен, что пытается сделать код ниже. Хотелось бы помочь кому-то на этом.вопросы по 0xff

int pval = t_gamma[depth[i]]; 
     int lb = pval & 0xff; 
     switch (pval>>8) { 
      case 0: 
       depth_mid[3*i+0] = 255; 
       depth_mid[3*i+1] = 255-lb; 
       depth_mid[3*i+2] = 255-lb; 
       break; 
      case 1: 
       depth_mid[3*i+0] = 255; 
       depth_mid[3*i+1] = lb; 
       depth_mid[3*i+2] = 0; 
       break; 
      case 2: 
       depth_mid[3*i+0] = 255-lb; 
       depth_mid[3*i+1] = 255; 
       depth_mid[3*i+2] = 0; 
       break; 
      case 3: 
       depth_mid[3*i+0] = 0; 
       depth_mid[3*i+1] = 255; 
       depth_mid[3*i+2] = lb; 
       break; 
      case 4: 
       depth_mid[3*i+0] = 0; 
       depth_mid[3*i+1] = 255-lb; 
       depth_mid[3*i+2] = 255; 
       break; 
      case 5: 
       depth_mid[3*i+0] = 0; 
       depth_mid[3*i+1] = 0; 
       depth_mid[3*i+2] = 255-lb; 
       break; 
      default: 
       depth_mid[3*i+0] = 0; 
       depth_mid[3*i+1] = 0; 
       depth_mid[3*i+2] = 0; 
       break; 
     } 
+0

Вы написали это или нашли это? В чем он состоит? Каков общий код, который вы пытаетесь сделать? Или вам просто интересно, что это за 0xff? – Bart

+0

'lb' означает последний байт – unkulunkulu

+0

Вы работаете над * кодом * C++? Только один? Не имеет никакого смысла – jcoder

ответ

9

0xff означает "шестнадцатеричное число ff" - другими словами, целое число 255, который имеет двоичное представление 00000000000000000000000011111111 (при использовании 32-битных чисел). Оператор & выполняет побитовое И-операцию. a & b даст вам целое число с битовой комбинацией, которая имеет во всех местах, где b имеет 0 в 0, в то время как во всех местах, где b имеет 1, используется соответствующее битовое значение из a (это также идет наоборот) , Например, побитовый И 10110111 и 00001101 равен 00000101.

В этом случае pval & 0xff предоставит вам самые правые 8 бит от pval.

Что касается кода, я считаю, что он пытается преобразовать значения цвета из специального формата в стандартный RGB: значения цвета содержат одиннадцать бит, где три из них указывают диапазон цветов (например, 000 кажется для указания диапазона «от белого до синего», а 001 означает «от красного до желтого»), а самые правые восемь бит указывают цвет в этом диапазоне.

1
int lb = pval & 0xff; 

Эта операция выполняет побитовую операцию на ПВСЕ с 0xff.

Поскольку 0xff представляется как 1 в нижних 8 битах целого числа, он эффективно маскирует pval, поэтому он оставляет только значение в последних 8 бит.

Таким образом, другими словами, он просто игнорирует все остальное целочисленное значение и выполняет простой расчет по модулю 256. Но обычно это просто для извлечения последних бит.

+0

Я понимаю, что последние 8 бит даны lb. но почему это простой расчет по модулю 256? не очень уверен, что он ... – laksh

+0

позволяет взглянуть на 4-битный пример: 1111 = 15 теперь добавить 1 к этому, и вы получите 10000, который равен 16 или 0 mod 16. следующий бит 110000, который 32 + 16 (вы можете видеть, что любой добавленный бит - это просто кратное 16) ... то же самое относится к 256 .. следующий бит - 512 (2 * 256), следующий - 1024 (4 * 256) и т. д. –

1

ПВС является INT, но наименьшие 8 бит имеют особое значение, а остальные биты имеют другой

  3    1 
      1    6  8  0 
      +--------+--------+--------+--------+ 
pval = |aaaaaaaa|aaaaaaaa|aaaaaaaa|bbbbbbbb| 
      +--------+--------+--------+--------+ 

Код «INT фунт = ПВС & 0xff» возвращает только значение из бит 'b'.

pval >> 8 возвращает значение битов 'a'.

Что касается кода, мне кажется, что он преобразует некоторые данные в цветовую карту, чтобы ее можно было отобразить. Хотя информации недостаточно, чтобы быть действительно уверенным.

Смежные вопросы