2009-06-12 2 views
1

Ma structure de données est initialisé comme suit:convertir une valeur en ligne, la colonne et l'omble

[[0,0,0,0,0,0,0,0] for x in range(8)] 

8 caractères, 8 rangées, chaque rangée comporte 5 bits pour des colonnes, de sorte que chaque entier peut être dans la plage comprise entre 0 et 31 inclusivement.

Je dois convertir le nombre 177 (peut être entre 0 et 319) en char, en ligne et en colonne. Je vais essayer à nouveau, cette fois avec un meilleur exemple de code. Aucun bit n'est défini.

Ok, j'ai ajouté l'inverse au problème. Peut-être que ça va aider.

chars = [[0,0,0,0,0,0,0,0] for x in range(8)] 

# reverse solution 
for char in range(8): 
    for row in range(8): 
     for col in range(5): 
      n = char * 40 + (row * 5 + col) 
      chars[char][row] = chars[char][row]^[0, 1<<4-col][row < col] 

for data in range(320): 
    char = data/40 
    col = (data - char * 40) % 5 
    row = ? 
    print "Char %g, Row %g, Col %g" % (char, row, col), chars[char][row] & 1<<4-col 
+0

votre code ressemble à 4x4, de toute façon pas clair comment 177 doit être divisé en char, ligne, col. Pouvez-vous décrire ce que vous essayez de faire? –

+0

C'est pour un 8x5 :) Je ferai un meilleur exemple. – Scott

Répondre

2

D'accord, cela semble que si vous travaillez avec un écran LCD 1x8, où chaque personnage est de 8 rangées de 5 pixels. Donc, vous avez un total de 8 * (8 * 5) = 320 pixels, et vous voulez mapper l'index d'un pixel à une position dans le "framebuffer" décrivant le contenu de l'affichage.

Je suppose pixels sont distribués comme celui-ci (indiqué pour le premier caractère uniquement), vos boucles initiales indiquent que c'est est correct:

0 1 2 3 4 
5 6 7 8 9 
10 11 12 13 14 
15 16 17 18 19 
20 21 22 23 24 
25 26 27 28 29 
30 31 32 33 34 
35 36 37 38 39 

Nous avons alors:

# Compute which of the 8 characters the pixel falls in, 0..7: 
char = int(number/40) 

# Compute which pixel column the pixel is in, 0..4: 
col = number % 5 

# Compute which pixel row the pixel is in, 0..7: 
row = int((number - char * 40)/5) 

J'utilisé explicitement int() s pour préciser que les nombres sont des nombres entiers.

Notez que vous souhaiterez peut-être retourner la colonne, car elle les numérote à partir de la gauche.

+0

Vous avez parfaitement décrit ma situation et vous avez répondu à la question. Merci. – Scott

1

Êtes-vous à la recherche de la fonction divmod?

[Edit:. En utilisant des opérateurs de python au lieu de langage pseudo]

char is between 0 and 319 

character = (char % 40) 
column = (char/40) % 5 
row  = (char/40)/5 
+0

Ça n'a pas marché pour moi. J'imagine que mod est là quelque part, mais jusqu'à présent, je suis perplexe. – Scott

+0

div est/et mod est% en python. Je vais modifier ma réponse pour refléter cela. –