97 votes

Bitwise et à la place de l'opérateur modulus

Nous savons que, par exemple, le modulo d'une puissance de deux peut être exprimé de la manière suivante :

x % 2 inpower n == x & (2 inpower n - 1).

Exemples :

x % 2 == x & 1
x % 4 == x & 3
x % 8 == x & 7 

Qu'en est-il de la non puissance générale de deux nombres ?

Disons :

x % 7== ?

8 votes

@Neil - Modulo et Binary And sont des opérations assez fondamentales, je suppose qu'elles sont à peu près les mêmes dans tout langage informatique.

1 votes

Je suis un peu fatigué de ne pas voir la langue affichée :) Mais je suppose qu'en général, s'ils ne le précisent pas, je suppose que cela signifie C++ ou C. Je me demande si c'est vraiment vrai

1 votes

Pour tous ceux qui ont du mal à comprendre, jetez un coup d'œil à stackoverflow.com/a/13784820/1414639 . Oh, et dans JS avec V8 je reçois un très légère l'amélioration des performances par l'utilisation d'opérateurs binaires.

77voto

polygenelubricants Points 136838

Tout d'abord, il est en fait inexact de dire que

x % 2 == x & 1

Contre-exemple simple : x = -1 . Dans de nombreux langages, y compris Java, -1 % 2 == -1 . C'est-à-dire, % n'est pas nécessairement la définition mathématique traditionnelle de modulo. Java l'appelle "opérateur de reste", par exemple.

En ce qui concerne l'optimisation par bit, seules les puissances modulo de deux peuvent être "facilement" effectuées en arithmétique par bit. D'une manière générale, seules les puissances modulo de base b peut "facilement" se faire avec la base b la représentation des nombres.

En base 10, par exemple, pour les valeurs non négatives. N , N mod 10^k c'est juste prendre le moins significatif k les chiffres.

Références

1 votes

-1 = -1 (mod 2) Je ne vois pas où vous voulez en venir. Vous voulez dire que c'est pas la même chose comme le reste de l'IEEE 754 ?

2 votes

@BlueRaja : le résidu commun pour -1 dans le mod 2 est 1 fr.wikipedia.org/wiki/Modular_arithmetic#Remainders

0 votes

@BlueRaja : Si tu autorises les nombres négatifs, ce dont tu peux être fondamentalement sûr (d'autant plus qu'aucune langue n'a été mentionnée) est que (a / b) / b + a % b == a pour les opérateurs de type C, a et b entiers, b non nul, et aussi que abs(a % b) < abs(b) avec les mêmes réserves.

18voto

VeeArr Points 3504

Cela ne fonctionne que pour les puissances de deux (et souvent uniquement pour les positives) car elles ont la propriété unique de n'avoir qu'un seul bit à "1" dans leur représentation binaire. Comme aucune autre classe de nombres ne partage cette propriété, il est impossible de créer des expressions de type bit-and pour la plupart des expressions de modulus.

2 votes

Si vous opérez sur une architecture ternaire, alors cela change un peu les choses... les chances sont cependant nulles.

0 votes

J'aime comment vous le formulez : "qui change les choses un peu "

13voto

jdmichal Points 6283

C'est un cas particulier car les ordinateurs représentent les nombres en base 2. Ceci est généralisable :

(nombre) base % de base x

est égal aux x derniers chiffres de (nombre) base .

5voto

David Harris Points 21

Il existe des modules autres que les puissances de 2 pour lesquels des algorithmes efficaces existent.

Par exemple, si x est un int non signé de 32 bits, alors x % 3 = popcnt (x & 0x55555555) - popcnt (x & 0xaaaaaaaa)

4voto

AshuPro Points 59

Modulo "7" sans opérateur "%".

int a = x % 7;

int a = (x + x / 7) & 7;

3 votes

Ne fonctionne pas pour 10 % 2 = 0. ( 10 + 10/2 ) & 2 = 15 & 2 = 2, De même 10 % 6 = 4. ( 10 + 10/6 ) & 6 = 11 & 6 = 2

11 votes

De même, pourquoi vouloir diviser quand on veut éviter d'utiliser le modulo ? A priori, l'instruction pour diviser est la même que celle pour obtenir le reste.

2 votes

@SriramMurali C'est parce que vous avez utilisé un mod pair, bien sûr que ça ne marcherait pas, c'est une solution de contournement pour étrange comme le dit l'OP.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X