Olá Pessoal,
Precisei de uma função para retornar os 4 bits menos significativos e os 4 bits mais significativos de um byte e como não encontrei prontas, escrevi de forma didática os códigos abaixo.
Como exemplo, para um byte = 00010010 teremos em decimal 18.
A função highBits(18) retornará 1; // (0001).
e a função lowBits(18) retornará 2 ; // (0010)
Resultando = 12 em hexadecimal
Se os colegas que trabalham com Arduino puderem ajudar simplificando as funções para ficarem mais rápidas, ficarei agradecido.
unsigned int lowBits(unsigned int _valor) {
unsigned int valor0, valor1, valor2, valor3;
valor0 = bitRead(_valor,0);
valor1 = bitRead(_valor,1);
valor2 = bitRead(_valor,2);
valor3 = bitRead(_valor,3);
return valor3*8 + valor2*4 + valor1*2 + valor0;
}
unsigned int highBits(unsigned int _valor) {
unsigned int valor4, valor5, valor6, valor7;
valor4 = bitRead(_valor,4);
valor5 = bitRead(_valor,5);
valor6 = bitRead(_valor,6);
valor7 = bitRead(_valor,7);
return valor7*8 + valor6*4 + valor5*2 + valor4;
}
Tags:
Olá Milton,
Que tal essa solução:
unsigned int lowBits(unsigned int x) {
unsigned int lowx = x & B00001111;
return lowx;
}
unsigned int highBits(unsigned int x) {
unsigned int highx = x >> 4;
return highx;
}
Abraço;
Olá Marcos,
Parabéns pela simplificação das funções, ficaram ótimas!
Abç
pode tentar as funções lowbyte() e highbyte()
Olá Marcelo,
Eu tentei as funções que você indicou, mas elas são para selecionar bytes inteiros.
Agradeço pela sua sugestão também.
Abç
Boa noite, acho que minha sugestão seria assim:
unsigned char MHSB (unsigned char valor) { // MSB (Most half significant bits)
return ((valor & 0xF0)>>4);
}
unsigned char LHSB (unsigned char valor) { // LSB (Least half significant bits)
return (valor & 0x0F);
}
Mas caso alguém tenha uma sugestão mais apreciável, fiquem a vontade para comentar e sugerir.
Olá Jisser, parabéns
Essa solução ficou ótima também, o que demonstra que temos muito chão para percorrer na programação do Arduino.
Será que alguém ainda tem mais uma solução inusitada?
Abç
Como você está trabalhando com 8bits não com 16, sugiro utilizar o tipo byte no lugar de unsigned int.
Além de não precisar alocar em outra variável para retornar o valor.
byte lowBits(byte value)
{
return (value & 0x0f);
}
byte highBits(byte value)
{
return (value >> 4);
}
Valeu Bruno,
Seu código ficou enxuto! muito bom.
Abç
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por