O módulo de aritmética

O "módulo" é um dos aritmentiche disponível em quase todas as linguagens de programação (Eu usei a primeira vez com o Commodore Basic 64) . Pode aparecer como um operador simples, como no caso do Actionscript ou Javascript, que ambos usam o caráter "por cento" (b%), ou como um método ou instrução. Para os desenvolvedores podem ser úteis em contextos aparentemente diferentes. Gskinner falou recentemente, mostrando alguns exemplos clássicos, mas interessante.

Simplificando, a operação retorna dois números formam o resto da sua divisão. Para completar, dizemos que o funcionamento do módulo é um tema muito amplo, que eu discuti no a criptografia RSA ! Desta vez, porém, não falar de códigos ou cifras, mas as coisas úteis muito mais simples.

Divisível por uma alternância ...

O primeiro uso que podemos fazer a operação do módulo é determinar se um número é divisível por um número b! Se o risultatto de uma b% (% vou usar aqui a notação para indicar o funcionamento do módulo) é zero, uma é divisível por b. Eu me lembro quando eu tinha a ver com um problema como eu não sabia o funcionamento do módulo. Sobre o Commodore 64 que eu precisava saber se um número era divisível por 2. Na época eu usei esta sintaxe (eu encontrei o código origionale - ano 1983):

1
2
3
10 INPUT A
12 B = A / 2: IF B = INT (B) THEN PRINT "O NÚMERO OK" A "e" EQUAL ": GOTO 10
14 PRINT "O NÚMERO" A "E" ODD ": GOTO 10

O BASIC do Commodore 64, no entanto, não tem o módulo de operação - pelo menos que eu me lembro!

Basicamente exatamente o que eu estava fazendo isso por sua própria natureza torna a operação do módulo: 2 verificou-se que a divisão não teve descanso, neste caso, verifique se o resultado não continham decimal ( IF B = INT(B) )! Se a operação de divisão é igual ao seu total, o número é igual!

Se a ter o nosso valor a ser testado, a mesma coisa pode ser resolvida por:

1
2
3
a % 2 ) == 0 ) { if ((2%) == 0) {
/ / Mesmo
}

Ou, para três, por:

1
2
3
a % 3 ) == 0 ) { if ((3%) == 0) {
/ / Divisível por 3
}

Pequena nota: graças à trilha se você tem a ver com as potências de 2 annche há um modo mais rápido para verificar se um número é par ou ímpar. Em notação binária, de fato, os números são todos iguais a zero o primeiro pedaço! Assim, usando os operadores lógicos, você pode saber se um número é par ou ímpar simplesmente "protestante" o primeiro bit:

1
2
3
! ( a & 1 ) ) { if ((a & 1)) {
/ / Mesmo
}

Na Assembleia, por exemplo, isso é pão e manteiga! É ainda mais imediata e simples (o Motorola 68020, por exemplo, tinha uma instrução BTST que "testado" apenas um único bit ;) ). – moltiplicazione bit a bit) tra il nostro valore a e 1 (chiamato maschera ). As operações lógicas (AND, OR, NOT, XOR, etc ...), na verdade, são conhecidos por ser mais rápido em termos de corrida, e depois "máquina do tempo!" (a & 1) executa a operação lógica AND ( & - Multiplicação bitwise) entre o nosso valor a , e 1 (chamado de máscara). Se a = 7 (00000111), por exemplo:

1
2
3
00000111 E
= 00000001
00000001; estranho

Se a 8 =:

1
2
3
00001000 E
= 00000001
00000000, igual

Não só podemos verificar os números, ou seja, com o primeiro bit a 0 e, portanto, divisível por 2, mas também pode ocorrer se um número é divisível por 4, 8, 16, 32, 64, etc ... usando os formulários apropriados:

1
2
3
! ( a & 3 ) ) { if ((a & 3)) {
/ / Divisível por 4 (máscara = 00000011 = 3), desde 4 é 00000100)
}

Se os últimos dois bits são definidos como zero o número é divisível por 4! Se os últimos 3 bits (máscara 00.000.111) são a zero o número é divisível por 8! E assim por diante :)

Gskinner mostra o uso do módulo, nos casos de geração alternativa de valores. Um exemplo clássico é para mudar o fundo de uma lista de itens:. Um branco e um cinza Gskinner oferece:

1
2
3
4
5
rowIndex % 2 == 0 ) { if (rowIndex% 2 == 0) {
rowColor = 0xFFFFFF;
{ Else {}
rowColor = 0xCCCCCC;
}

Primeiro de tudo, o código acima pode ser resolvido com uma única linha de código:

1
2 == 0 ) ? 0xFFFFFF : 0xCCCCCC ; rowColor = (rowIndex% 2 == 0) 0xFFFFFF: 0xCCCCCC;?

Além disso, neste caso específico, gostaria de evitar realmente executar uma forma "pesada" da operação. Esta situação em particular é frequentemente envolvido em um loop, por isso seria "bom" para não desperdiçar ciclos de relógio da máquina. Nestes casos, eu gosto mais limpa a solução (e lógico):

1
fooIndex == false ) ) ? 0xFFFFFF : 0xCCCCCC ; rowColor = (fooIndex = (fooIndex == false)) 0xFFFFFF: 0xCCCCCC;

o false , a seconda di come vogliamo impostare inizialmente il nostro colore sfondo. Onde fooIndex precedentemete é um valor definido como true ou false , dependendo de como nós inicialmente definir a nossa cor de fundo. Esta abordagem é mais sutil, menos imediata, no início, mas mais rápido porque ele executa lógica verdadeiro / falso. la condizione (fooIndex == false) sarà falsa e di conseguenza fooIndex verrà impostato da true a false. Se fooIndex é verdade, quando a instrução é executada (fooIndex = (fooIndex == false) ) a condição (fooIndex == false) é falsa e, conseqüentemente, fooIndex será definido de verdadeiro para falso. verrà impostato da false a true! Na segunda vez, no entanto, a condição (fooIndex == false) é verdadeiro e, em seguida, fooIndex é definido de falso para verdadeiro! E assim por diante ...

Repetições: para assistir o comportamento

A aritmética finita, que é a base do funcionamento da operação do módulo, é muitas vezes referida como aritmética do relógio. Um relógio clássico tem um mostrador com as mãos divididas em 12 horas (12 mais 12 dias a noite!), Suficiente para indicar qualquer um dos 24 horas por dia. At 08:00 Se eu lhe pedisse que hora o seu relógio vai marcar entre 18 horas, a sua resposta seria 8 +18 = 26! Mas a 02:00 da noite! Involuntariamente e sem o saber, talvez, realizar operações conitnuamente formulário sempre que estamos lidando com os tempos.

Na Itália, são usados ​​para o sistema 24 horas (ou mista). Quando apontamos às 16:00 pretendem que hora do que em outros países é indicado como 04:00 pm. Quem usa o postfix am / pm para distinguir daqueles horas da noite ofa, mesmo com mais freqüência realiza a operação do módulo, módulo 12, neste caso! Nós, italianos, e outros, no entanto, ser acostumado a considerar as 24 horas, realizar operações com Form 24!

Quando estou 11 horas da manhã (11:00 para todos) e pensar "em cinco horas", os italianos respondem 5 +11 = 16 (quatro da tarde), um estranho poderia também responder 5 +11 = 4:00. Desde 5 + 11 aritmética clássica, é, obviamente, 16, como fez o estranho para atender quatro horas? Ele simplesmente executar o módulo 12 sobre o resultado: 5 + 11 = 12 = 16 mod 4. Não é necessário que você tome uma calculadora para verificar a precisão do cálculo, mas esses passos são um pouco de tudo, mostrou uma face de um relógio e colocar as mãos nos 11 mentalmente, em seguida, adicione - sempre visualmente - 5 horas, como que por magia você realmente cerca de 4! É por isso que eles são chamados de quatro da tarde 16 :)

Na Itália, em vez disso, usamos um Form 24, na verdade: 11 +5 = 16 mod 24 = 16. Quando estou às 23:00 horas, cinco horas depois do 28:00 não será, porque 28 modulo 12 = 4! 122514884225 Formulário 24 = 17! O que acontece é que o resultado fundamental do Formulário 24 nunca será superior a 24. Mas o mais interessante é que os números são repetidos indefinidamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1% 24 = 1
2% 24 = 2
3% 24 = 3
...
22% 24 = 22
23% 24 = 23
24% 24 = 0
25% 24 = 1
26% 24 = 2
27% 24 = 3
...
48% 24 = 0
49% 24 = 1
50% 24 = 2
51% 24 = 3
...

Esta repetição é uma facilidade desarmante. Imagine, por exemplo, eles devem ter um objeto, um MovieClip, semelhante a um tabuleiro de xadrez, em quatro colunas. Criar um MovieClip quandrato, 55 × 55 pixels e esportiamolo painel de propriedades como Simbolo . O código a seguir terá quatro colunas do nosso MovieClip e "cabeça" com a operação do módulo:

1
2
3
4
5
6
7
Number = 4 ; var col: Número = 4;
var i= 0 ; i < 12 ; i ++ ) { for (var i = 0; i <12; i + +) {
Sprite = new Simbolo ( ) ; var s: Sprite = new Symbol ();
s ) ; addChild (s);
= ( i % col ) * 60 ; s. = x (com i%) * 60;
= Math . floor ( i / col ) * 60 ; s. y = Math piso (i / col) * 60.;
}

cresce in modo indefinito. Como você pode ver a partir do código, a variável i ciclo for crescimento indefinidamente. Mas a coordenada x do nosso MovieClip nunca excede um certo valor, e se repete indefinidamente! Aqui está um exemplo concreto:

Carregando flash ...

Através dos dois botões você pode variar o número de colunas (a forma) eo número total de elementos, usando o algoritmo acima.

Um comentário: "A forma aritmética"

Deixe um comentário

XHTML PERMIT TAG: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> CÓDIGO DE INSERÇÃO:
 <pre></pre> // blocco generico <code></code> // blocco generico [cc_actionscript][/cc_actionscript] // Actionscript [cc_actionscript3][/cc_actionscript3] // Actionscript 3 [cc_css][/cc_css] // CSS Style Sheet [cc_html][/cc_html] // HTML [cc_js][/cc_js] // Javascript [cc_objc][/cc_objc] // Objective-C [cc_php][/cc_objc] // PHP [cc_sql][/cc_sql] // SQL 


Parar SOPA