7
votes

Code rapide pour la recherche d'un bit-Bitt-Tableau pour un ensemble contigu / transparent?

Y a-t-il un code raisonnablement rapide qui peut m'aider à rechercher rapidement un grand bitmap (quelques mégaoctets) pour des courses de zéro contigu ou d'un bits?

Par "raisonnablement rapide", je veux dire quelque chose qui peut tirer parti de la taille du mot de la machine et de comparer des mots entiers à la fois, au lieu de faire une analyse bit-bit qui est horriblement lente (comme on le fait avec vecteur ).

C'est très utile pour E.G. Recherche dans le bitmap d'un volume d'espace libre (pour la défragmentation, etc.).


5 commentaires

Vous ne pouvez pas traiter votre tableau en tant que tableau d'entiers et comparer entier à zéro?


@Andrew: Cela dépend en quelque sorte de ce que vous essayez de réaliser ... Les bits peuvent ne pas être alignés 8 bits à la fois.


Vous pouvez comparer 6 octets (si le BMP est un fichier image couleur: 6 octets est deux pixels contiguous) avec un tableau de 6 zéros.


@eHarvest: Je ne parle pas de photos! Ceci est complètement sans rapport avec des images raster. Je parle de bits de tableaux, c'est-à-dire un tableau de bits.


Désolé, j'ai lu votre question trop vite ...


3 Réponses :


1
votes

Windows a un rtl_bitmap < / a> Structure de données On peut utiliser avec ses API.

Mais j'avais besoin du code pour cela il y a parfois, et donc je l'ai écrit ici (avertissement, c'est un peu laid):
https://gist.github.com/3206128

J'ai Seulement partiellement le testé, il peut donc toujours avoir des bugs (en particulier sur inverse ). Mais une version récente (légèrement différente de celle-ci) semblait être utilisable pour moi, alors ça vaut la peine d'essayer.

L'opération fondamentale pour l'ensemble de la chose est de pouvoir - rapidement - trouver le Longueur d'une course de bits: xxx

tout le reste doit être facile à construire sur ceci, compte tenu de sa polyvalence.

J'ai essayé d'inclure un code SSE , mais cela n'a pas sensiblement amélioré la performance. Cependant, en général, le code est plusieurs fois plus rapide que de faire une analyse bit-budge, alors je pense que cela pourrait être utile.

Il doit être facile à tester si vous pouvez obtenir une prise de Vecteur S de la mémoire tampon - et si vous êtes sur Visual C ++, il y a une fonction que j'ai incluse qui le fait pour vous. Si vous trouvez des bugs, n'hésitez pas à me faire savoir.


0 commentaires

0
votes

Je ne peux pas comprendre comment bien faire directement sur des mots de mémoire, donc j'ai constitué une solution rapide qui fonctionne sur des octets; Pour plus de commodité, croquons l'algorithme pour compter des contigus:

Construisez deux tables de taille 256 où vous écrirez pour chaque nombre compris entre 0 et 255, le nombre de suivi 1 au début et à la fin de l'octet. Par exemple, pour le numéro 167 (10100111 en binaire), mettez 1 dans la première table et 3 dans la deuxième table. Appelons la première table BBEG et la deuxième courbe de table. Ensuite, pour chaque octet B, deux cas: s'il s'agit de 255, ajoutez 8 à votre somme actuelle de votre ensemble contiguë actuel de ceux et vous êtes dans une région de ceux. D'autre, vous mettez fin à une région avec BBEG [B] des bits et commencez une nouvelle avec les bits de courbure [B]. Selon les informations que vous voulez, vous pouvez adapter cet algorithme (c'est une raison pour laquelle je ne mettez pas ici aucun code, je ne sais pas quelle sortie vous voulez).

Un défaut est qu'il ne compte pas (petit) ensemble contigu de ceux à l'intérieur d'un octet ...

Outre cet algorithme, un ami me dit que s'il s'agit de la compression de disque, recherchez simplement des octets différents de 0 (zone de disque vide) et 255 (zone de disque complète). C'est une heuristique rapide de construire une carte de quels blocs que vous devez compresser. Peut-être que c'est au-delà de la portée de ce sujet ...


0 commentaires