• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

tjsneves

contar bits

17 mensagens neste tópico

O meu objectivo é contar bits com 1 de um determinado numero,mas tenho que o fazer com o deslocamento a direita e o bit a bit &. Alguém me pode ajudar,é que não estou a perceber como o fazer porque pelo que sei o bit a bit& vai comparar dois numeros e neste caso eu só quero um.

cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se pensares na representação binária de um número é relativamente simples.

Quando fazes & entre dois números, vais fazer um 'E' com todos os bits dos números e devolver o número resultante, por exemplo:

17 & 13

10001 & 01101 = 00001

Por outro lado, o deslocamento à direita desloca todos os bits para a direita, como nome indica:

17 >> 1

10001 >> 1 = 01000 = 8

Agora, a partir daqui, qual é a maneira mais simples de "ver bit a bit" se é 1 ou 0? Isto é, tens o teu número 'x', faz sentido fazer & com que tipo de número?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

talvez com um numero com todos os bits igual a 1???mas isso vai dar o mesmo numero.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, se fizeres com todos os bits iguais a 1 tens exactamente o mesmo número. Se fizeres com todos os bits iguais a 0, ficas com tudo a 0.

Então que número é que podemos usar para ficar só com um bit igual?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

então o melhor numero seja o 1 ou seja 0001 e assim verificar cada um deles e assim se o numero se mantiver e porque ocorreu 1 e utilizo um contador para contar quantos bits 1, senao e porque o bit e 0.no passo seguinte utilizo o deslocamento a direita para voltar a fazer o mesmo ate que tenha acabado de contar todos os bits 1.é isso???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exactamente =)

Se tiveres o número 14 (1110), por exemplo, a sequência seria:

contador=0

1110 & 0001 = 0000, contador fica na mesma

1110 >> 1 = 0111,

0111 & 0001 = 0001,  contador+=1

0111 >> 1 = 0011,

0011 & 0001 = 0001, contador+=1

0011 >> 1 = 0001,

0001 & 0001 = 0001, contador+=1

0001 >> 1 = 0000,

Pára a execução, o contador vale 3, ou seja tem 3 bits iguais a 1

Atenção que aqui representamos os números com 4 bits, mas eles são representados sempre por mais, embora isso n seja relevante porque podemos sempre fazer mais deslocamentos à direita, o importante é parar a execução quando o número for 0, porque já não há mais bits para contar.

Qualquer dúvida, shoot.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok vou experimentar depois digo alguma coisa...muito obrigado pela ajuda.

cumps

edit:mas e preciso converter decimal para binario ou faz isso automatico???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os números são representados internamente por binário, logo não, não precisas de converter nada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Funciona perfeitamente! mas agora tou com um pequeno problema pois quero repetir ate o utilizador inserir 0.

#include <stdio.h>

int main(void){
int a;	
do {				
	printf("insira numero\t");
	scanf("%d",&a);
	int contador=0;
	int n=a;
	while (n>0){
		if (n & 1==1){
			contador=contador+1;
			n=n>>1;
		}		
		else
			n=n>>1;
	}
	printf("o numero %d contem %d bits com valor 1\n",a,contador);
	return 0;
} while (a>0);
}

qual e o problema?é em relaçao a declaraçao de a???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando inseres 0 ele diz-te que tem 0 bits com valor 1 e depois pára não é?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nao ele para mesmo k inserindo a=20.ou seja nao volta a correr.so corre uma vez apesar de la estar o while.

edit: pode o erro ser o return 0?que esteja a funcionar como fim da funçao???ou entao nas chavetas?conflito entre whiles?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok.entao e so retirar o return 0 que ele deve funcionar.ja vou experimentar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok.entao e so retirar o return 0 que ele deve funcionar.ja vou experimentar.

não deves retirar o return 0,  deves é passa-lo para fora do ciclo!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim eu sei mas por acaso funciona a mesma.muito obrigado

cumps

edit: é verdade faziam alguma alteração ao programa para ficar mais correcto??e mais funcional?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu no ciclo que conta os bits faria algo deste estilo:

while (n>0){
    contador+=(n&1); //Acrescenta o valor do último bit de 'n' ao contador
    n=n>>1;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora