2009-09-19 7 views
2

Voici un exemple que je courais à travers:opérations sans opérateurs de manipulation de bits au niveau du bit

private function bitwiseAnd(a:int, b:int):int { 
    var result:int = 0; 
    var n:int = 1; 
    while ((a > 0) && (b > 0)) { 
     if (((a % 2) == 1) && ((b % 2) == 1)) { 
      result += n;  
     } 
     a = a/2; 
     b = b/2; 
     n = n * 2; 
    } 
    return result; 
} 

Donc, fondamentalement, tout ce que je besoin est alors bitwiseOr et bitwiseNot et je suis fixé.
La raison en est que Pixel Bender ne prend pas en charge les opérations au niveau du bit (inexplicablement) mais prend en charge diverses opérations mathématiques. En outre, ils ne prennent pas en charge les boucles pour Flash non plus, mais ce qui précède peut simplement être étendu.

Je pensais à faire des opérations au niveau du bit sans opérateurs bit-à-pas, mais je ne pouvais pas imaginer comment le faire. Je ne saurais pas comment ce qui précède a été dérivé logiquement non plus.

+0

Désolé, ce n'est pas aussi compliqué que je pensais - nevermind. –

+0

BTW, Pixel Bender dans Flash ne supporte pas la fonction personnalisée non plus ... Mais oui, vous pouvez l'aligner manuellement ... –

Répondre

5

On dirait un exercice de base - en particulier « OR » (changement 2 apparences de « & & » à « || »):

private function bitwiseOr(a:int, b:int):int { 
    var result:int = 0; 
    var n:int = 1; 
    while ((a > 0) || (b > 0)) { 
     if (((a % 2) == 1) || ((b % 2) == 1)) { 
      result += n;  
     } 
     a = a/2; 
     b = b/2; 
     n = n * 2; 
    } 
    return result; 
} 

Il y a un peu plus de travail à faire avec pas - parce que vous pouvez Arrêtez la boucle tôt et vous devez savoir combien de bits à traiter. Le dernier problème est de savoir comment gérer le bit de signe; cela doit être retourné aussi. Idéalement, nous utiliserions des entiers non signés - je ne suis pas sûr qu'ils soient une option. Ce code évite les problèmes: il retourne 31 bits, laissant le 32e bit comme exercice pour le lecteur.

private function bitwiseNot(a:int):int { 
    var result:int = 0; 
    var n:int = 1; 
    var i:int = 0; 
    while (i < 31) { 
     if ((a % 2) == 0) { 
      result += n;  
     } 
     a = a/2; 
     n = n * 2; 
     i++; 
    } 
    return result; 
} 
+0

Pour retourner le bit de signe, remplacer "return result;" avec "résultat de retour + 1 << 31"; –

+0

Hey, merci à tous pour les commentaires instantanés (ce forum est incroyable), mais comme je l'ai dit, je me suis rendu compte que le problème n'était pas un gros problème presque immédiatement après avoir écrit la question. Mais je vais regarder tous les messages fournis. Merci encore. –

+0

Mais << est un opérateur au niveau du bit –

Questions connexes