如何解决了解彩色python上的操作时遇到的问题
我开始学习pygame,我买了一本书,在这本书中,我有以下脚本:
import pygame
pygame.init()
screen = pygame.display.set_mode((640,480))
all_colors = pygame.Surface((4096,4096),depth=24)
for r in xrange(256):
x = (r & 15) * 256
y = (r >> 4) * 256
print x," ",y
for g in xrange(256):
for b in xrange(256):
all_colors.set_at((x+g,y+b),(r,g,b))
screen.blit(all_colors,(0,0))
pygame.image.save(all_colors,"allcolors.bmp")
在此脚本中,我们生成的图像包含计算机可以产生的所有颜色,我不理解的唯一说明是:
-
x =(r&15)* 256
-
y =(r >> 4)* 256
有人骄傲地告诉我为什么他要进行这2次手术。我知道这是按位运算符,但我不明白他为什么要这么做:D。
解决方法
&
是按位 And 运算符。 15是00001111二进制。因此,(r & 15)
屏蔽了r
的低4位。结果在[0,15]范围内。>>
是右移运算符。 (r >> 4)
向右移动r
4位。如果r
是一个字节(8位)值,结果将再次在[0,15]范围内。(r & 15)
是r
的低4位,而(r >> 4)
是r
的高4位(如果r
在[0,255]范围内)。
for
循环
for r in xrange(256):
x = (r & 15) * 256
y = (r >> 4) * 256
可以由以下嵌套的for
循环代替:
for i in xrange(16):
for j in xrange(16):
r = i * 16 + j
x = j * 256
y = i * 256
表面尺寸为4096x4096。 4096 = 16 * 256。 x
和y
都在[0,4096)范围内。
这真是令人困惑的IMO。发生的情况是x
和y
(定义了屏幕上网格的位置)是从r
派生而来的,方法是取每个可能的{{1} }的价值,但这并不是很明显,而且您不应该因为没有成为初学者而感到难过;作者应该为编写棘手的代码而不发表评论感到难过。 :)
IMO,如果您正在做按位运算,最好将数字表示为十六进制,因为这样可以更直观地显示转换(例如,如果将十六进制乘以r
,则目标很明显如果您将十进制0x100
乘以十进制,则向左移两个十六进制数字。我还认为,最好让外循环遍历256
和x
并从这些值生成y
,而不要反过来做,因为数学是这样更简单。
这是我编写循环的方式(使用十六进制数字和注释)。我也将其编写为与Python 3兼容,但我认为它也应与Python 2向后兼容:
r
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。