gRoOvE 0 Denunciar post Postado Setembro 27, 2008 Tenho o seguinte exercício: Faça a função void SeparaData(short data) que recebe o parâmetro data com o seguinte formato: Dia - bits 15-11 Mês - bits 10-7 Ano - bits 6-0 A função deve separar as informações dia, mês e ano e imprimi-lás. Acredito que o usuário deve entrar: 27092008 e a função vai separar né? Não faço idéia de como começar "/ Compartilhar este post Link para o post Compartilhar em outros sites
IvanR 0 Denunciar post Postado Setembro 29, 2008 Fiz aki um pequeno esboço de como faria, não fiz testes de data ou números inválidos, só o feijão com arroz mesmo, me parece um pouco gambiarra, mas não achei outro modo não #include <stdio.h> #include <stdlib.h> //--------------------------------------------------------------------------- void separaData(int data){ int dia; int mes; int ano; dia = data / 1000000; mes = ((data - (dia * 1000000)) /10000); ano = ((data - (dia * 1000000)) - mes * 10000); printf("dia: %d\n",dia); printf("mes: %d\n",mes); printf("ano: %d\n\n",ano); } int main(int argc, char* argv[]) { separaData(11022001); separaData(01152001); separaData(01022007); system("pause"); return 0; } Quando o número começa com zero ele passa para a notação de octal, ai tem q arrumar um modo de voltar pra decimal. EDIT: Agora que vi que era pra ser feito com short e não com int e short não cabe esse número ai não, vai até 32.000 e alguma coisa Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Setembro 29, 2008 Ficou meio gambiarra mesmo, mas o primeiro valor deu certo, não entendi como funciona isso? Assume como a data sendo segundos? Tenho algo a ver com aquele tal de timestamp? Mas de qualquer forma, acho que não é isso velho, o exercício pede pra usar manipulação de bits, campos de bits, sei lá "/ Compartilhar este post Link para o post Compartilhar em outros sites
Edultra 13 Denunciar post Postado Setembro 30, 2008 Hum... vai ter que trabalhar com manipulação de bits tipo: A manipulação é feita em todos os bits da variável a qual não pode ser do tipo float ou double. Operador Ação & bit and | bit or ^ bit xor - exclusive or << shift left >> shift right ~ bit not (complemento) x << n irá rotacionar n vezes a variável x à esquerda. Compartilhar este post Link para o post Compartilhar em outros sites
IvanR 0 Denunciar post Postado Setembro 30, 2008 Oq eu fiz foi seguir oq você imaginava que o exercício faria e bolei um programa baseado nisso, imagine a data como 25072005 que você imagina que seja: 25/07/2005 dividindo o mesmo por 1000000, você retorna apenas o dia 25: 25072005 / 1000000 = 20,072005 como o inteiro desconsidera a vírgula ele captura apenas o 25 e por ai vai, é apenas uma manipulação de inteiros. Não tem como você passar a data 25072005 pra short pq short vai até 32.000 e 25.072.005 é muito maior que 32.000. Tinha que ter um exemplo pra ver oq ele de fato quer passar como parâmetro Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Setembro 30, 2008 #include <stdio.h> void separa_data(unsigned short data) { unsigned short dia,mes,ano; ano = data & 0x007F; mes = (data >> 7) & 0x000F; dia = (data >> 11) & 0x001F; printf("DIA= %hd \t MES= %hd\t ANO=%hd\n",dia,mes,ano); } int main() { unsigned short diaD,mesD,anoD; scanf("%hd %hd %hd",&diaD,&mesD,&anoD); unsigned short T = 0; T = T|diaD; T = T << 4; T = T|mesD; T = T << 7; T = T|anoD; separa_data(T); return(0); } Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Outubro 1, 2008 Isis, tenho algumas dúvidas: 1º: testei o código que você postou com as seguintes entradas: 10 05 2000. O resultado foi DIA=10 MES=15 ANO=80. 2º: qq significa esse %hd? 3º: com base em que, você fez essas operações usando deslocamento e o "ou"? Algebra booleana? 4º: isso "0x007F" é endereço de memória? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Outubro 1, 2008 Groove, preste atenção na quantidade de bits do ano: 7 bits = 128 valores possíveis. Os anos variam de 0 a 127, somente. Se tem que utilizar notação biased isso é outro problema. Notação hexa não se usa somente p/ endereçar memória.Serve de máscara também. Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Outubro 2, 2008 Groove, preste atenção na quantidade de bits do ano: 7 bits = 128 valores possíveis. Os anos variam de 0 a 127, somente.Como assim? Essa notação "0x007F" equivale a 112 em decimal? Outra coisa, esse "0x" indica ser um hexa né? A representação máxima de elementos seria essa "0x0000"? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Outubro 2, 2008 Máscara em hexa é utilizada p/ se extrair bits. O valor em decimal que você digita para o ano tem que estar entre 0 e 127,já que você quer enfiar isso em 7 bits. 2000 precisa de 11 bits p/ ser representado. 0x0000 = 0 0xFFFF = 255 Compartilhar este post Link para o post Compartilhar em outros sites
IvanR 0 Denunciar post Postado Outubro 16, 2008 Desculpem ressucitar este tópico, mas é que precisei de marcara e voltei a este tópico, fiquei com uma duvida, oq acontece com isso: T = T|diaD; ? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Outubro 16, 2008 Isso é um or binário. Compartilhar este post Link para o post Compartilhar em outros sites
IvanR 0 Denunciar post Postado Outubro 17, 2008 Isis, esse programa funciona mesmo? Pois digitei 12101997 e nada, estou usando de forma errada ? Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Outubro 17, 2008 Você tem que digitar tipo 12 10 97 Compartilhar este post Link para o post Compartilhar em outros sites