Ir ao conteúdo
  • Cadastre-se

Como usar campo de bit


joubet

Posts recomendados

:(

Como faço para usar operadores de bit para acender e apagar bits e com isso acender e apagar os leds de teclas como: NUM LOCK

FIZ:

printf ("\n Apague NUM LOCK\n");
    x= getchar();
    x= x | x;
    printf("%d%\n",x);
    itoa(x, binario3, 2);
    printf("%s\n", bi

Para qualquer tecla especial pressionada, X retorna o valor 10. Essas teclas não podem ter o mesmo valor. Concordam ?

Obrigado

Link para o comentário
Compartilhar em outros sites

Algumas teclas tem retorno igual porque o comando de captura mostra apenas o conteudo do

primeiro byte. então parece que todas são iguais. porém o retorno de algumas teclas faz-se de 2 a 3

bytes para diferenciar. Uma vez em assembler queria diferenciar alt direito do esquerdo e percebi

que a diferença esta no 3. byte. Tente setar com desligado todos os bytes envolvidos para tecla num.

Agora ler todos os bytes depende também do comando de leitura do teclado. Como

basic Input é menos completo que get - Clipper lastkey - inkey também apresentam diferenças de retorno

ou seja uns podem ser mais limitados que outros. Só não conheços os comandos de retorno em C.

Não se se te ajudei

Link para o comentário
Compartilhar em outros sites

Não entendi muito bem. pego o 1byte com i = getch();, mas e o 2 byte e possível terceiro ? se eu fizer i = getch(); de novo, repitirei a captura do primeiro. Teria de ter um jeeito de varrer os bytes da tecla, para depois apagar ou acender o lad do da tecla Num Lock com os operadores de bit, por exemplo.

tem como fazer ?

Obrigado

Link para o comentário
Compartilhar em outros sites

:(

Eduardos. Eu fiz:

printf ("\n Apague NUM LOCK\n");
    x= getch();
    x= x | x;
    printf("%d%\n",x);
    itoa(x, binario3, 2);
    printf("%s\n", binario3);

Ao fazer isso, teclei Num Lock varias vezers, nada foi mostraso na tela. Por fim, teclei ENTER, e tive como resultado:

10

1010

Para qualquer tecla especial wque eu Pressione, terei o valor decimal dez. Nunca tive outro valor de retorno. O que estou fazendo errado ?

Obrigado

Link para o comentário
Compartilhar em outros sites

EduardoS,

Ok. Como seria esas duas etapas ? seria ago:

a=getch(()

b= getch(()

precionando a mesma tecla duas vezes ? como armazenar esse valor nuca única variável depois para exibção ?

Como capturar o valor de Num Lock então ? a ideia inicial era apagar e acender os leds do teclado usando operadores bit à bit.

Obrigado

Link para o comentário
Compartilhar em outros sites

:(

EduaroS,

Ok. Suponha:

É sabido que:

0 é 0000 em binário

1 é 0001

2 é 0010

3 é 0011

4 é 0100

5 é 0101

É sabido que em C, números octais, são representados com um 0(zero) na frente. Então pergunto: Como somar números binários em C ?

Ex:

A = 0010

B =0011

C= A +B

Se eu fizer isso não terei o valor de C igual a 0101, então como fazer ?

Obrigado

Link para o comentário
Compartilhar em outros sites

  • mês depois...

:(

Pessoal, fiz o seguinte experimento: Veja o fragmento de código abaixo:

   ........................
.   .
    int valor1 = 4;
    int valor2 = 5;
    int x,y;
    char binario[8];
    char binario2[20];
    char binario3[20];
    char binario4[20];

    printf ("\nAperte as teclas de F1-F12 ou alguma outra tecla especial\n");
    x= getch();
    y= getch();
    x= x | x;
    y= y | y;
    printf("%d  %d\n",x,y);
    itoa(x, binario3, 2);
    printf("%s\n", binario3);
    itoa(y, binario4, 2);
    printf("%s\n", binario4);

    ....................................
    .

O fragmento de código acima, mostra captura dos dois códigos ASCII de teclas especiais. Apesar de estar usando o operador | de campo de bit, não consigo ver o efeito de escolha do OU uma coisa OU outra. Como poderia usar o OU (|) de campo de bit como se usa para comparar coisas com o comando if ?

Ex:

     If (binario3 | binario4)

    {
        faz ALGO
    }
else

    {
        faz OUTRA COISA
    }

Podem me ajudar ?

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Joubet,

O operador "ou lógico" ( | ) atua de forma diferente do "ou condicional" ( || ), o ou condicional funciona organizando os desvios do programa, o ou lógico é um operador como soma ou subtração, ex:


if(funcao1() || funcao2())
  //faz alguma coisa


if(!funcao1())
  if(!funcao2())
    goto sair;
//faz alguma coisa
sair:

No exemplo acima os dois blocos são equivalentes, a funcao2 só sera executada se a funcao1 retornar false (0), já no exemplo abaixo:


if(funcao1() | funcao2())
  //faz alguma coisa

Ele vai executar as duas funções, executar um ou lógico entre os dois resultados e fazer alguma coisa se o resultado do ou logico for diferente de 0, só para lembrar as operações lógicas são:


| - ou inclusivo bit a bit - 001 | 011 = 011 - se qualquer um dos dois bits for 1 o resultado é 1, se os dois forem 0 o resultado é 0;
& - e lógico bit a bit - 001 | 011 = 001 - se os dois bits forem 1 o resultado é 1, se qualquer um dos bits for 0 o resultado é 1;
^ - ou exclusivo bit a bit - 001 | 011 = 010 - se um e apenas um dos dois bits for 1 o resultado é 1, se os dois forem 0 ou se os dois forem 1 o resultado é 0.

Portanto:


    x= x | x;
    y= y | y;

Esses comandos são redundantes e não alteram o valor de x ou y,


     If (binario3 | binario4)

    {
        faz ALGO
    }
else

    {
        faz OUTRA COISA
    }

Para o resultado do ou logico (inclusivo) entre binario3 e binario4 ser 0 os dois precisam ter valor 0.

Link para o comentário
Compartilhar em outros sites

:(

OK.

Com base no que foi explicado, coloquei um if abaixo do printf("%s\n", binario4);

do programa acima, e eliminei as linhas: x= x | x; e y= y | y;

if (binario3 | binario4)
       {
        printf ("Um dos bits e 1 (um)\n");
       }
   else
        {
         printf ("Os dois bits sao 0 (zero)\n");
        }

Ao compilar o programa, tive como resposta, os seguintes erros:

C:\Meus documentos\binario.c In function `main':

56 C:\Meus documentos\binario.c invalid operands to binary |

O que está errado ?

Obrigado,

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

A variável binario3 e binario4 são do tipo char[], tente mudar o tipo da variavel ou usar um dos elementos da array, ex:


if (binario3[0] | binario4[0])
       {
        printf ("Um dos bits e 1 (um)\n");
       }
   else
        {
         printf ("Os dois bits sao 0 (zero)\n");
        }

EDIT: Não sei que resultado você espera do seu experimento, mas como essas duas variaveis foram preenchidas com strings acho que você não tera o resultado esperado.

Link para o comentário
Compartilhar em outros sites

Minha ideia, é demontrar ou testar na prática, a explicação sobre ou lógico de campo de bit (|) que você (Eduardos) explicou no post 12, usando um if

O problema, é que se eu mudar o tipo da variável binário3 ou binario4, não poderei usar a função itoa() para mostrar o numero binário selecionado.

veja o post 11 para ajudar a entender meu objetivo, junto com os posts

12 e 13.

Obrigado

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Joubet,

Entendi em parte o que você quer, as variaveis binario3 e binario4 são arrays de char e após o itoa terão o valor ascii "0" ou "1" (48 e 49 respectivamente), o que não serve para você.

Para o if do post 14 funcionar da para fazer de pelo menos três maneiras (atenção aqui, não entendi bem aonde você quer chegar, se não for isso, por favor, explique antes de me xingar):

1) Converter as arrays de ascii para 0s e 1s


for(i = 0; i < 8; i++)
  binario3[i] &= 1;

2) Descobrir no if se o resultado é "1"


if( (binario3[0] | binario4[0]) == "1")

3) Fazer o if com os inteiros, mas considerando só o bit que interessa


if( (x | y) & 1)//obs: 1 para o bit menos significativo, 128 para o mais signifcativo de um byte

Link para o comentário
Compartilhar em outros sites

:(

EduardoS,

Na verdade estou com dificuldade para me explicar, pois (ou) de campo de bit não é a mesma coisa que (ou) lógico. O que estou tentando fazer é usar o (ou) de bit como ou lógico.

Veja sua explicação:

| - ou inclusivo bit a bit - 001 | 011 = 011 - se qualquer um dos dois bits for 1 o resultado é 1, se os dois forem 0 o resultado é 0;

com bae nisso, gostaria de comparar as seguencias de bits de binario3 e binario 4, e de pendendo da sequencia quefor mostar ta tela o valor de binário3, senão binário4. estou achando que (|) não se presta a isso, mas a ideia é comparar as duas variáveis e mostrar uma ou outra em função do valor.

a ideia é usar operado de bit (ou) para mostrar um resustado ou outro.

Acho que na verdade, eu não esteja compreendendo bem o conceito de (|) de campo de bit. Poderia por um exemplo ilustrativo, que imprimisse na tela seu restado. Digo isso, porque o AND de bit (&) parece ter um comportamento parecido

EuardoS,

Fiz o seguinte teste:

...................
int valor1 = 4;
int valor2 = 5;
char binario4[20];
printf ("\nComparando os numeros 4 e 5\n");
    if (itoa(valor1 | valor2, binario4, 2))
       {
        printf ("\nResultado:Um dos bits e 1 (um)\n\n");
       }
   else
        {
         printf ("\nResultado:Os dois bits são 0 (zero)\n\n");
        }
        
    system ("pause");
...................................

Resultado:

Comparando os numeros 4 e 5

Resultado:Um dos bits e 1 (um)

O fato é que não estou sabendo ativar o “else”, já mudei os valores 4 e 5 por outros, e o resultado é sempre o mesmo. Definitivamente, não estou sabendo interpretar o “ou” e o “e” de bit. Poderia ajudar ?

Obrigado

Link para o comentário
Compartilhar em outros sites

  • mês depois...

:(

Pessoal, resolvi os problemas de "ou" (|) de campo de bit. Estou precisando, de uma explicação teórica de complemento a um e a dois em campo de bit.

Qual a diferença ente complemento um e a dois e complemento bit a bit ?

Os livros que li explicam de forma complicada.

Obrigado

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Complemento um/bit a bit - inverte os bits, ex: 101 - 010

Complemento dois - "nega" o valor, ex: 101 - 011*

*O segundo ta difícil entender? É assim mesmo, ele não é uma operação bit a bit, mas sim uma operação aritimética, transforma um 3 em -3, o resultado maluco do exemplo acima é porque números negativos são expressos por um 1 (bit de sinal) seguido pelo complemento dois (tudo bem que estamos no Brasil mas... Não acha menos estranho usar "two's complement"?) do módulo do número, exemplo (para facilitar a leitura vou usar apenas 4 bits):

1111 => -1

1110 => -2

1101 => -3

1100 => -4

1011 => -5

1010 => -6

1001 => -7

1000 => -8

O complemento dois de um número é igual ao seu complemento um mais 1.

Link para o comentário
Compartilhar em outros sites

:ahh:

OK. Entendi, que complemento a dois , é o inverso de complemento a um, e que com isso o número binario se torna negativo. Gostaria de entender, como posso ao ler um numero binário, saber que ele é negativo ou positivo ?

Ex:

1111 => -1

Se você não dissesse que o valor binário é negativo eu não saberia. Pensaria que fosse 15 na base 10.

No que se refere a ao complemento a um, qual a vantagem/utillidade de ser inverter bits ?

Sei que operaçõe de com bits são usadas para definir numeror IP e permissão de acesso em Linux, que outras aplicações teria ?

Obrigado

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

A representação binária de inteiros com sinal é assim:


11111111111111111111111111111111
|+-------Bits com o valor do número
+------- Bit de sinal (sempre o primeiro).

Quando o bit de sinal é 0 o número é positivo, quando os bit de sinal é 1 o número é negativo e o valor dele é o complemento a dois do valor (Bits de valor), apesar de confuso ajuda as ALUs do processador com as contas:


-3 1101
+ 4 0100
----------
    10001

O primeiro 1 é o "carry" e é descartado, sobrando 1 que é o resultado de -3 + 4.

A utilização do complemento a um (e de qualquer outra operação bit a bit) vai depender da lógica do programa, até passaria um exemplo, mas não tenho nenhum que seja fácil de entender.

Link para o comentário
Compartilhar em outros sites

:(

Vamos ver se entendi corretamente, no exemplo, que você forneceu,

-3 1101

+ 4 0100

----------

10001

O bit mais a esquerda(em vermelho) seria o bit de sinal, certo ? caso minha interpretação de sua resosta esteja certa, ainda asim, terei dificudade de localizar o sinal, pois como saberei realmente quantos bits tem o número ? veja seu exempllo,anterior:

11111111111111111111111111111111

|+-------Bits com o valor do número

+------- Bit de sinal (sempre o primeiro).

Está certo, que você está dizendo que o bit de sinal é sempre o primeiro, mas suponha, o numero três fosse escrito apenas

101
, eu deveria sub entender, um 0(zero) na frente do primeiro bit ?

como posso saber o comprimento(numero de bits) de um numero binário ? nas tabelas sempre vejo quatro digitos para cada numero

EX:

0101 =3
, devo contar de quatro e quatro da direita para esquerta e formar o número ?

Por essas tabelas se eu comparar com seu exemplo, teria -3 e não 3.

Outra coisa que me deixa curuiso, como representar um numero binário e C, com variáveis tipo inteiro, se todo numero iniciado por 0 (zero) em C é tido como octal ?

Ex:

int 0101

Para C isso não é o numero 3 em binário, mas sim um numero octal.

Obrigado

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Depende do tamanho da variavel, em um int (4 bytes) sera o primeiro bit de 32 bits ao todo, em um byte sera o primeiro de um total de 8 bits, a representação não é importante, já que o mais comum é escrever "-3" mesmo, se fosse escrever cada bit na hora de atribuir valor e o número fosse negativo seria preciso escrever todos os bits,

Quando a escrever os números, não é muito comum escrever bit a bit, escrever em hexadecimal é mais comum, use "0x" na frente, ex: 0xFF22CC33

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

:(

1) No post n#21 perguntei se tinha algum exemplo de complemento, você disse, que os exemplos eram complicados. Mas de qualquer forma poderia citar, apenal alguns exemplos de uso ?

2-a) Quando vejo falar em deslocamento de bit, imagino, que todos os bits sejam deslocados até o fim da seqüência de bits, e o último bit deslocado, vá para o início da seqüência na fila. Conclui corretamente ?

2-B) Sei, que os operadores >>, << fazem deslocamento de bit à esquerda e a direita. Qual seria sua aplicação pratica ?

3) Sei que as linhas abaixo:

itoa(valor1 | valor2, binario4, 2);
printf("\n\"Ou\" de campo de bit:   %s\n",binario4);

dão como resposta,

"Ou" de campo de bit: 10100

Entretanto, soube que o correto, seria: 101, e que o 00 seria lixo. Pergunto: como faço para mostrar somente o valor correto ?

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

1) O algoritimo Sha-1 usa muitos desses operadores.

2) Nos x86 existem oito (7, duas são redundantes) instruções de deslocamento de bit, as duas primeiras letras definem a operação, a ultima a direção (l = left, r = right)

sal/sar = arithmetic shift, desloca os bits, preenche os espaços vazios a direita com 0, e a esquerda com o bit de sinal, o C executa essa instrução quando encontra os operadores << e >>, x << y é equivalente a x * (2 elevado a y) e x >> y é equivalente a x / (2 elevado a y), nos processadores de hoje essas instruções são muito mais rapidas que divisões e multiplicações,

ex (o segundo operador esta com representação decimal apenas para facilitar a leitura):

00100100 << 4 = 01000000

00100100 >> 4 = 00000100

10100100 >> 4 = 11110100

shl/shr = logical shift, desloca os bits, preenche os espaços vazios com 0, ex:

00100100 << 4 = 01000000

00100100 >> 4 = 00000100

10100100 >> 4 = 00000100

nota: Não ha diferença entre o shl e o sal, as duas são reduntantes, a diferença entre o sar e o shr é que o primeiro preenche os bits vazios com o bit de sinal, o segundo preenche com 0. No C o shr é executado pelo operador >>>.

rol/ror = rotate, esse é o deslocamente de bits que você mencionou, não existe no C um operador que faça isso, ex

10110111 rol 3 = 10111101

rcl/rcr = rotate with carry, desloca os bits e preenche os bits vazios com o carry, tambem não existe no C.

3) Como esta o código completo?

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...