微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

了解彩色python上的操作时遇到的问题

如何解决了解彩色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")

在此脚本中,我们生成的图像包含计算机可以产生的所有颜色,我不理解的唯一说明是:

  1. x =(r&15)* 256

  2. 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。 xy都在[0,4096)范围内。

,

这真是令人困惑的IMO。发生的情况是xy(定义了屏幕上网​​格的位置)是从r派生而来的,方法是取每个可能的{{1} }的价值,但这并不是很明显,而且您不应该因为没有成为初学者而感到难过;作者应该为编写棘手的代码而不发表评论感到难过。 :)

IMO,如果您正在做按位运算,最好将数字表示为十六进制,因为这样可以更直观地显示转换(例如,如果将十六进制乘以r,则目标很明显如果您将十进制0x100乘以十进制,则向左移两个十六进制数字。我还认为,最好让外循环遍历256x并从这些值生成y,而不要反过来做,因为数学是这样更简单。

这是我编写循环的方式(使用十六进制数字和注释)。我也将其编写为与Python 3兼容,但我认为它也应与Python 2向后兼容:

r

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。