On 23/04/2013 13:21, francesco wrote:
> Il Tue, 23 Apr 2013 03:30:14 -0700, fmassei ha scritto:
>
>> On Tuesday, April 23, 2013 12:25:46 PM UTC+2, francesco wrote:
>>> Ho un numero intero x, devo creare una funzione che restituisca 1 se x
>>> può essere rappresentato come un numero intero complemento a due,
>>> ad n-bit, 0 altrimenti.
>>> Il vincolo su n è che 1<=n<=32.
>>> Esempio: funzione(5,3)=0 funzione(-4,3)=1 E' possibile usare solo i
>>> seguenti operatori: ! ~ & ^ | + << >>
>>> Non sono ammessi cicli e if
>>
>> Basta che ci pensi un secondo..
>> Su n bit, qual'è il massimo (o il minimo) numero che puoi rappresentare?
>> :)
>>
>> Ciao!
>
> Il minimo dovrebbe essere -2^(n-1) ed il massimo 2^(n-1)+1, quindi
Il valore del massimo non è corretto, è 2^(n-1)-1.
> -4 dovrebbe essere 1100
> +5 dovrebbe essere 0101
>
> entrambi li posso rappresentare con 3 bit più il bit di segno
[..]
Qui hai un po' di confusione, se n = 3 significa che puoi usare solo
3 bits, non 3 più quello del segno. Quindi non puoi rappresentare
il 5 come 0101, ma semplicemente 101 (appunto 3 bits). Beh direi che
la risposta te la sei già data da solo, in pratica devi solo testare
che il numero x stia nell'intervallo no?
/* solo C99 */
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int c(int32_t x, uint32_t n)
{
return (x <= (1 << n - 1) - 1) && (x >= - (1 << n - 1));
}
void e(int32_t x, uint32_t n)
{
printf("\nnumero = %" PRId32 ", bits = %" PRIu32 ","
" intervallo [%" PRId32 ", %" PRId32 "]: ",
x, n, - (1 << n - 1), (1 << n - 1) - 1);
if (!c(x, n)) printf("NON ");
puts("esiste complemento a due");
}
int main(void)
{
e(5, 3);
e(-4, 3);
e(6, 4);
e(-10, 2);
e(1, 2);
return 0;
}
--
Vincenzo Mercuri