char* printRGBA(unsigned int color)
提取并以十进制形式返回个人 RGBA颜色的组件。
RGBA颜色(红色,绿色,蓝色, Alpha)可以使用32位存储 无符号整数,格式如下:RRRRRRRR GGGGGGGG BBBBBBBB AAAAAAAA,其中每个分量为8位,范围为(0255)。
该函数将以下列格式返回unsigned int颜色作为小数字串:“(R,G,B,A)”。
例如,亮黄色具有整数值
4291559679,并以二进制表示为:11111111 11001100 00000000 11111111,printRGBA
将返回字符串:“(255,204,0,255)”。
我的尝试:
char* printrgba(long long int num)
{
int arr[64];
cin>>num;
int i=0,r;
while(num!=0)
{
r = num%2;
arr[i++] = r;
num /= 2;
}
for(int j=i-1;j>=0;j--)
cout<<arr[j];
}
我不知道如何进一步继续
答案 0 :(得分:2)
您在原帖中所说的内容是关键:
您的号码存储为32bit unsigned integer
。
个别值为RRRRRRRR GGGGGGGG BBBBBBBB AAAAAAAA
你可以看到,有32个单独的位,R,G,B和A各8个。
这种类似于此的一种常见方法是一次通过32位数字8位。
要获取AAAAAAAA
值,例如:
int a_values = num & 0x000000FF;
&
运算符是bitwise and
。该运营商将提取您号码的某些部分。
上面的十六进制字符串表示的位掩码是00000000000000000000000011111111
,这将允许您获得最右边的8位;
您可以通过这种方式获得所需的每组8位。
获得价值后,要将其传达给来电者,您有两种选择:
malloc
保留足够的空间,并sprintf
进入其中。请记住,如果你这样做,你的来电者必须释放记忆。char *
和数据的大小,然后sprintf
。这样,你的调用函数就更明显了它们负责释放内存。对于选项2,有sprintf
个相关函数,如snprint
,可帮助检查大小。
如果您实际在c++
工作,但仍然需要打印到char *
,上述建议仍然适用,但您可以使用ostringstream
创建字符串以这种方式
ostringstream stream;
stream << val1 << val2 << val3 << etc;
然后,您可以根据需要将字符串流中的数据复制到char *
。