2.73
2.73
2 . 7 3
int saturating_add ( int x, int y) {
unsigned int tot= x+ y;
int len= ( sizeof ( int ) << 3 ) - 1 ;
unsigned int flag= ! ( ( ( ( x>> len) ^ ( y>> len) ) & 1 ) | ! ( ( ( x>> len) ^ ( tot>> len) ) & 1 ) ) ;
flag= ~ flag+ 1 ;
x= x>> len;
printf ( "%x\n" , ( tot| flag) - ( flag& ( ( unsigned int ) x^ ( 1 << len) ) ) ) ;
}
2.93
2.93
2 . 9 3
typedef unsigned float_bits;
float_bits float_absval ( float_bits f) {
int len= ( sizeof ( int ) << 3 ) - 1 ;
float_bits o= ( 1 << len) & f;
float_bits a= ( - 1 ) << 24 ;
float_bits b= ( a& ( f<< 1 ) ) ;
float_bits c= ! ( a^ b) ;
float_bits d= ! ( ! ( f<< 9 ) ) ;
float_bits flag= c& d;
o= ( flag<< len) & o;
f= ( ~ ( 1 << len) ) & f;
printf ( "%x\n" , f| o) ;
}
2.97
2.97
2 . 9 7
typedef unsigned float_bits;
float_bits float_i2f ( int i) {
if ( ! i) return ( float_bits) 0 ;
int len= ( sizeof ( int ) << 3 ) - 1 ;
float_bits o= ( 1 << len) & ( float_bits) i;
float_bits num= ( ~ ( 1 << len) ) & ( float_bits) i;
if ( o) num= o- num;
int dest= 31 ;
float_bits ans= 0 , e= 0 ;
while ( ! ( ( 1 << dest) & num) ) -- dest;
if ( dest> 23 && ( num& 1 << ( dest- 23 ) ) ) num+ = ( 1 << ( dest- 24 ) ) ;
dest= 31 ; while ( ! ( ( 1 << dest) & num) ) -- dest;
ans= ( float_bits) num& ( ~ ( 1 << dest) ) ;
if ( dest> 23 ) ans= ans>> ( dest- 23 ) ;
else ans= ans<< ( 23 - dest) ;
e= 127 + dest;
ans| = ( e<< 23 ) ;
if ( o) ans| = ( 1 << len) ;
return ans;
}
}