例如,在传统的web十六进制中,某个基数-16表示RGB值。例如,45A19C在RGB中等于(69,161,156)。
然而,您将从该数字转换为RGB值,而不是在基数16中给出该数字。
所以在上面的例子中,45A19C的基数是4563356。因此,转换为RGB的4563356等于(69,161,156)。
因此,假设给定的整数先前存储在变量n中,并且介于0到16777215之间。取数字n,并将其转换为0到255之间的RGB值。将三个值作为列表R,g,b返回或保存在变量中。
在这里可以找到RGB到RGB int.。此链接转换与您的尝试相反的做法。
最短代码获胜。
如果需要澄清,请问,这样我就可以把我的问题解决得更有帮助。
发布于 2015-01-04 09:42:13
比AVR寄存器中的寄存器大的数量用多个寄存器表示。因此,当将32位'n‘传递给一个函数时,它作为4x8位寄存器传递。有效的R(r24)、G(r23)和B(r22)可以直接寻址,而无需借助CPU的寄存器寻址来完成任何额外的工作。
以下是解压操作的一些C代码:
unsigned char r( unsigned long n ){return n>>16&255;}
unsigned char g( unsigned long n ){return n>>8&255;}
unsigned char b( unsigned long n ){return n>>0&255;}avr-gcc 4.8拆卸的例子:
.global r
.type r, @function
r:
ret
.size r, .-r
.global g
.type g, @function
g:
mov r24,r23
ret
.size g, .-g
.global b
.type b, @function
b:
mov r24,r22
ret
.size b, .-b对于红色,GCC只是发出返回代码,因为红色字节刚好在返回寄存器中。对于绿色和蓝色,它将相应的寄存器复制到返回寄存器中并返回。实际的打包/解压是由ABI处理的--当在函数调用边界以外的某个地方处理时,它完全由寄存器寻址处理。复制和返回操作代码都是查看CPU中发生的这种情况所需的开销--编译器可以直接使用这些寄存器(如果不需要)将结果放在返回寄存器中。当处理任何32位整数时,都可以使用免费的RGB包装/解压。
另一种思考方法是AVR的寄存器将大量数字表示为8位寄存器的列表,而该列表恰好为我们解压缩RGB。
发布于 2015-01-04 00:10:21
n16 6?+256B1>尽管它与@MartinBüttner的基本相同,但也不妨发布这篇文章来推广鸵鸟。(我唯一改变的是b -> B,因为所有内置的函数要么是鸵鸟的符号,要么是大写字母,还有G -> 16,因为鸵鸟没有那么漂亮的数字--它确实应该这么做)。
将代码翻译为Golfscript (18个字节):
n 16 6?+256base 1>发布于 2015-01-04 00:07:54
IntegerDigits[n,256,3]基本上和我的CJam答案一样。但是我不知道有多少语言可以用任意的基来处理基转换,所以我想我应该同时发布这两个版本。
这个函数通过使用IntegerDigits的第三个参数来处理前导零,该参数将结果填充到指定的数字数。
https://codegolf.stackexchange.com/questions/43155
复制相似问题