Bueno, no busco que nadie me la haga y mas a estas horas, solo que me digan si saben donde esta la solucion, el enunciado de mi uni es este:
/*
- CS:APP datalab
- Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved.
*
- Traducció al català: Ignasi Furió
*
- Fonaments de computadors
- Pràctica 1: Manipulació de bits
*
- bits.c - Fitxer font amb les vostres solucions.
- Aquest és el fitxer que heu d'entregar al professor responsable.
*
- ALERTA: No heu d'incloure el fitxer de capçaleres <stdio.h>; pot confondre al
- compilador dlc. Així i tot podeu usar printf per a tasques de depuració sense
- incloure <stdio.h>, malgrat que pot provocar alertes del compilador.
- Habitualment convé fer cas dels missatges d'alerta del compilador, però en aquesta
- ocasió vos ho podeu estalviar.
*/
#include "btest.h"
#include <limits.h>
/*
- Instruccions pels estudiants:
*
- Fase 1: Ompliu l'estructura següent amb la vostra identificació.
/
team_struct team =
{
/ Nom de grup:"43204933_43194225", /
"grup1",
/ Nom de l'estudiant 1: Substituïu-lo amb el nom complet del primer component /
"Xavier Femenias Segui",
/ Login ID 1: Substituïu-lo pel "DNI" del primer component /
"43204933",
/ Els següents camps, sols es modifiquen si el grup és de dos components /
/ Nom de l'estudiant 2: Substituïu-lo amb el nom complet del segon component /
"Gerard Martinez Amer",
/ Login ID 2: Substituïu-lo pel "DNI" del segon component */
"43194225"
};
#if 0
/*
- Fase 2: Llegiu atentament les següents instruccions.
*/
Com a solució de la pràctica heu d''entregar aquest fitxer després
d''editar el conjunt de funcions que apareix a continuació.
NORMES DE CODIFICACIÓ:
Substituïu la línia de "return" de cada funció per una o més línies
de codi C que la implementin. El vostre codi ha de complir les següents
normes d''estil:
int Funct(arg1, arg2, ...) {
/* breu descripció del funcionament de la vostra implementació */
int var1 = Expr1;
...
int varM = ExprM;
varJ = ExprJ;
...
varN = ExprN;
return ExprR;
}
Cada "Expr" és una expressió on SOLS s''usa el següent:
- Constants enteres entre 0 i 255 (0xFF), ambdós inclosos. No podeu codi C que
usar constants grans com, per exemple, 0xffffffff.
- Arguments de les funcions i variables locals (no variables globals).
- Operadors unaris sobre enters ! ~
- Operadors binaris sobre enters & ^ | + << >>
En algun dels problemes les restriccions poden ser majors.
Cada "Expr" pot estar formada per múltiples operadors. No hi ha la restricció
d''un únic operador per línia.
Està terminantment prohibit:
- Usar construccions de control com if, do, while, for, switch, etc.
- Definir o usar macros.
- Definir qualsevol funció addicional en aquest fitxer.
- Cridar qualsevol funció.
- Usar qualsevol altre operador, com a &&, ||, -, or ?:
- Usar qualsevol forma de "casting" (modificació del tipus d''una variable).
Podeu assumir que la vostra màquina:
- Usa complement a dos de 32 bits per representar enters.
- Realitza els desplaçaments a la dreta de forma aritmètica.
- El seu comportament és imprevisible si es desplaça un enter més que la
mida d''una paraula (word)
EXEMPLES D''ESTIL DE CODIFICACIÓ ACCEPTABLE:
/*
- pow2plus1 - retorna 2x + 1, on 0 <= x <= 31
/
int pow2plus1(int x) {
/ explota els desplaçaments per calcular potències de 2 */
return (1 << x) + 1;
}
/*
- pow2plus4 - retorna 2x + 4, on 0 <= x <= 31
/
int pow2plus4(int x) {
/ explota els desplaçaments per calcular potències de 2 */
int resultat = (1 << x);
resultat += 4;
return resultat;
}
NOTES:
- Usau el compilador dlc (data lab checker), descrit en l''enunciat per validar
la legalitat de les vostres solucions.
- Cada funció té un nombre màxim d''operadors (! ~ & ^ | + << >>)
que poden usar-se en la seva implementació. Aquest nombre màxim és
comprovat per dlc. Considerau que "=" no compta, per tant, podeu
usar tantes assignacions com calgui sense perjudici.
- Usau el test btest per comprovar la correcció de les vostres solucions.
- El nombre màxim d''operacions per funció apareix en el comentari de capçalera
de cada una. Si aparèixen inconsistències entre el que s''indica aquí i en
el guió de pràctiques, la d''aquest fitxer és la bona.
#endif
/*
- Fase 3: Modificau les següents funcions d'acord amb les normes de codificació.
*
- IMPORTANT. PER TAL D'EVITAR SORPRESES EN L'AVALUACIÓ:
- 1. Usau el compilador dlc per comprovar que les solucions compleixen les
- regles de codificació.
- 2. Usau el test btest per comprovar que les vostres solucions provoquen les
- respostes esperades. Alerta amb els casos propers a Tmin i Tmax.
*/
/*
- bitNor - x|y usant sols ~ i &
- Exemple: bitNor(0x6, 0x5) = 0xFFFFFFF8
- Ops. legals: ~ &
- Max ops: 8
- Dificultat: 1
*/
int bitNor(int x, int y) {
return x&y;
}
/*
- isZero - retorna 1 si x == 0, i 0 altrament
- Exemples: isZero(5) = 0, isZero(0) = 1
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 2
- Dificultat: 1
*/
int isZero(int x) {
return !x;
}
/*
- minusOne - retorna el valor -1
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 2
- Dificultat: 1
/
int minusOne(void) {
return -1;
}
/
- copyLSB - deixa tots els bits com el menys significatiu (LS de x
- Exemple: copyLSB(5) = 0xFFFFFFFF, copyLSB(6) = 0x00000000
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 5
- Dificultat: 2
/
int copyLSB(int x) {
return 2;
}
/
- divpwr2 - Calcula x/(2n), amb 0 <= n <= 30
- i arrodonint a zero
- Exemples: divpwr2(15,1) = 7, divpwr2(-33,4) = -2
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 15
- Dificultat: 2
/
int divpwr2(int x, int n) {
return 2;
}
/
- getByte - Extreu el byte n de la paraula x
- Bytes numerats des de 0 (LS a 3 (MS
- Exemples: getByte(0x12345678,1) = 0x56
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 6
- Dificultat: 2
/
int getByte(int x, int n) {
return 2;
}
/
- conditional - igual que x ? y : z
- Exemple: conditional(2,4,5) = 4
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 16
- Dificultat: 3
/
int conditional(int x, int y, int z) {
return 2;
}
/
- isLessOrEqual - si x <= y retorna 1, si no retorna 0
- Exemple: isLessOrEqual(4,5) = 1.
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 24
- Dificultat: 3
/
int isLessOrEqual(int x, int y) {
return 2;
}
/
- isNegative - retorna 1 si x < 0, retorna 0 altrament
- Exemple: isNegative(-1) = 1.
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 6
- Dificultat: 3
/
int isNegative(int x) {
return 2;
}
/
- multFiveEights - multiplica per 5/8 arredonint a 0.
- Exemples: multFiveEights(77) = 48
- multFiveEights(-22) = -13
- Pots suposar que |x| < (1 << 29)
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 12
- Dificultat: 3
/
int multFiveEights(int x) {
return 2;
}
/
- reverseBytes - inverteix l'ordre dels bytes de x
- Exemple: reverseBytes(0x01020304) = 0x04030201
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 25
- Dificultat: 3
/
int reverseBytes(int x) {
return 2;
}
/
- log2 - retorna part_entera(log base 2 de x), on x > 0
- Exemple: log2(16) = 4
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 90
- Dificultat: 4
/
int log2(int x) {
return 2;
}
/
- logicalNeg - implementa l'operador !, usant tots els
- operadors legals excepte !
- Exemples: logicalNeg(3) = 0, logicalNeg(0) = 1
- Ops. legals: ~ & ^ | + << >>
- Max ops: 12
- Dificultat: 4
/
int logicalNeg(int x) {
return 2;
}
/
- satAdd - suma dos nombres, però si provoca un overflow positiu returna
- el valor màxim possible i, si l'overflow és negatiu retorna el
- valor positiu mínim possible.
- Exemples: satAdd(0x40000000,0x40000000) = 0x7fffffff
- satAdd(0x80000000,0xffffffff) = 0x80000000
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 30
- Dificultat: 4
/
int satAdd(int x, int y) {
return 2;
}
/
- tc2sm - Converteix de complement a 2 a signe-magnitud
- on el MSB és el bit de signe
- Pots suposar que x > TMin
- Exemple: tc2sm(-5) = 0x80000005.
- Ops. legals: ! ~ & ^ | + << >>
- Max ops: 15
- Dificultat: 4
*/
int tc2sm(int x) {
return 2;
}