Skip to content

Instantly share code, notes, and snippets.

@gbrls
Last active December 18, 2019 23:20
Show Gist options
  • Save gbrls/225ed8b6bc701ee6488cc231e1101bd7 to your computer and use it in GitHub Desktop.
Save gbrls/225ed8b6bc701ee6488cc231e1101bd7 to your computer and use it in GitHub Desktop.
bitmask tricks
#include <stdio.h>
/*
Este é um exemplo com algumas aplicações de bitmasks e suas operações
a << b (shift esquerda) : move os bits de 'a' 'b' posições à esquerda. Ex.: 0110 << 2 = 011000
é equivalente a multiplicar 'a' por 2^'b'.
a >> b (shift direita) : move os bits de 'a' 'b' posições à direita. Ex.: 0110 >> 2 = 01
é equivalente a dividir 'a' por 2 'b' vezes.
a & b (and bit a bit) : 0101 & 0011 = 0001
a | b (ou/or bit a bit) : 0101 | 0011 = 0111
a ^ b (ou exclusivo/xor bit a bit) : 0101 | 0011 = 0111 (ver https://pt.wikipedia.org/wiki/Porta_XOR#Tabela_de_Verdade)
~a (not bit a bit) : ~0101 = 1010
*/
// printar um inteiro de 32 bits em binario
void print_bin(int a) {
int bits=32; // quantidade de bits de 'a' que irão ser printados
for(int i=bits-1;i>=0;i--) {
// estamos movendo um bit da esquerda para direita com (1<<i)
putchar(a&(1<<i)?'1':'0');
}
putchar('\n');
}
// gerar todos os subconjuntos de um vetor
void print_subset(int* arr, int sz) {
for(int i=0;i<(1<<sz);i++){
int tmp[sz],pos=0;
for(int j=0;j<sz;j++){
if(i&(1<<j)) tmp[pos++]=arr[j];
}
for(int j=0;j<pos;j++) printf("%d%c",tmp[j],j==pos-1?'\n':' ');
if(i==0) puts("Vazio");
}
}
int main() {
print_bin(42);
print_bin(0xff);
print_bin(0x100);
int arr[3] = {1,2,3};
print_subset(arr, sizeof(arr)/sizeof(int));
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment