2014-09-11 6 views
1

Я работал над некоторым кодом на C, чтобы преобразовать три целых числа в их значения rgb (красный, зеленый синий), но он не работает, и я не могу понять, почему. В принципе, код читается в трех разных целых числах, используя метод getchar() (я пытаюсь использовать только getchar() и ничего больше). Вот мой код:Unsigned Int to RGB Значение в C

#include <stdio.h> 
#include <string.h> 

// functions 
void getRGB(unsigned int x); 

// input array 
unsigned char data[20]; 
int rounds = 0; 
unsigned int num1, num2, num3; 

int main(void) 
{ 
int i=0; 
int c; 
printf("Enter three integers between 0 and 2^32-1\n"); 
while((c = getchar()) != EOF) 
{ 
    if(c == '-') 
    { 
     puts("Negative numbers are NOT allowed, please try again."); 
     return 0; 
    } 
    while(isspace(c)) 
    { 
     c=getchar(); 
    } 
    while ((isdigit(c))) 
    { 
     data[i] = c; 
     i++; 
     c=getchar(); 
    } 
    rounds++; 
    if (rounds == 1) 
    { 
     num1 = atoi(data); 
     memset(data, 0, 20); 
     i = 0; 
    } 
    else if(rounds ==2) 
    { 
     num2 = atoi(data); 
     memset(data, 0, 20); 
     i = 0; 
    } 
    else if(rounds ==3) 
    { 
     num3 = atoi(data); 
     break; 
    } 
} 

getRGB(num1); 
getRGB(num2); 
getRGB(num3); 

return 0; 
} 



void getRGB(unsigned int x) 
{ 

unsigned int red = (x & 0xff000000) >> 24; 
unsigned int green = (x & 0x00ff0000) >> 16; 
unsigned int blue = (x & 0x0000ff00) >> 8; 

printf("num is %u == rgb (%u, %u, %u) \n", x, red, green, blue); 

} 

Любая помощь будет очень признательна, поскольку я полностью в тупике!

+0

вместо «она не работает», говорят, что вы получаете, и что вы ожидаете –

+0

Ты прав. Например, когда я вхожу 234, я ожидаю получить значение rgb (0, 0, 234). Вместо этого я получаю (0,0,0). – MattKos

+0

Преобразование, которое вы предоставили, выбрасывает наименее значимые 8 бит (которые являются единственными, которые использовались в вашем примере) – SleuthEye

ответ

2

Функция getRGB, которую вы предоставили, выбрасывает наименее значимые 8 бит. Более конкретно, предполагается, что компоненты RGB сохраняются в битах от 8 до 31 (где битого 0 является наименее значащим битом) в соответствии со следующей планировкой:

- Red component : bits 24-31 (hexadecimal mask `0xff000000`) 
- Green component : bits 16-23 (hexadecimal mask `0x00ff0000`) 
- Blue component : bits 8-15 (hexadecimal mask `0x0000ff00`) 

Таким образом, для ввода тестового значения 234 с шестнадцатеричным представлением 0x000000EA, соответствующий выход будет RGB = (0,0,0), так как бит 8-31 - это все нули. С другой стороны, учитывая размещенное преобразование, значения входного теста, который приведет к RGB = (0,0,234), будет в шестнадцатеричном формате 0x0000EA00 или, что эквивалентно, в десятичной 256 * 234 = 59904.

В качестве альтернативы, если вы хотели бы использовать 24 младших битов для компонентов RGB, вам необходимо обновить преобразования в:

unsigned int red = (x & 0x00ff0000) >> 16; 
unsigned int green = (x & 0x0000ff00) >> 8; 
unsigned int blue = (x & 0x000000ff); 
Смежные вопросы