《CSAPP》答案(第二章)(一)
P55
#include <stdio.h>
typedef unsigned char * byte_pointer;
void show_bytes ( byte_pointer start, size_t len) {
size_t i;
for ( i= 0 ; i< len; i++ ) {
printf ( "%.2x" , start[ i] ) ;
}
printf ( "\n" ) ;
}
int main ( ) {
int num = 114514 ;
show_bytes ( ( byte_pointer) & num, sizeof ( int ) ) ;
}
P56
#include <stdio.h>
typedef unsigned char * byte_pointer;
void show_bytes ( byte_pointer start, size_t len) {
size_t i;
for ( i= 0 ; i< len; i++ ) {
printf ( "%.2x" , start[ i] ) ;
}
printf ( "\n" ) ;
}
int main ( ) {
int num = 1919810 ;
show_bytes ( ( byte_pointer) & num, sizeof ( int ) ) ;
}
P57
#include <stdio.h>
typedef unsigned char * byte_pointer;
void show_bytes ( byte_pointer start, size_t len) {
size_t i;
for ( i= 0 ; i< len; i++ ) {
printf ( "%.2x" , start[ i] ) ;
}
printf ( "\n" ) ;
}
void show_short ( short x) {
show_bytes ( ( byte_pointer) & x, sizeof ( short ) ) ;
}
void show_long ( long x) {
show_bytes ( ( byte_pointer) & x, sizeof ( long ) ) ;
}
void show_double ( double x) {
show_bytes ( ( byte_pointer) & x, sizeof ( double ) ) ;
}
int main ( ) {
double num = 114514.1919810 ;
short nums = ( short ) num;
short num1 = ( long ) num;
double numd = ( double ) num;
show_bytes ( ( byte_pointer) & num, sizeof ( int ) ) ;
show_short ( num) ;
show_long ( num) ;
}
P58
#include <stdio.h>
typedef unsigned char * byte_pointer;
int is_little_endian ( ) {
int test = 0x11 ;
byte_pointer p = ( byte_pointer) & test;
if ( p[ 0 ] == 0x11 )
return 1 ;
else
return 0 ;
}
int main ( ) {
if ( is_little_endian ( ) )
printf ( "The machine is little endian\n" ) ;
else
printf ( "The machine is big endian\n" ) ;
}
P59
#include <stdio.h>
typedef unsigned char * byte_pointer;
size_t numCombine ( size_t x, size_t y) {
size_t mask = 0xff ;
size_t result = ( ( x& mask) | ( y& ~ mask) ) ;
return result;
}
int main ( ) {
size_t x, y;
scanf ( "%d" , & x) ;
scanf ( "%d" , & y) ;
printf ( "%d" , numCombine ( x, y) ) ;
}
P60
#include <stdio.h>
typedef unsigned char * byte_pointer;
size_t replace_byte ( unsigned x, int b, unsigned char plugin) {
size_t mask= ( ( unsigned ) 0xff ) << ( b<< 3 ) ;
return ( x& ( ~ mask) ) | ( ( ( unsigned ) plugin) << ( b<< 3 ) ) ;
}
int main ( ) {
printf ( "%x\n" , replace_byte ( 0x12345678 , 0 , 0xAB ) ) ;
printf ( "%x\n" , replace_byte ( 0x12345678 , 3 , 0xAB ) ) ;
}
P61
! ~ x
! x
! ~ ( x | ~ 0xff )
! ( ( x >> ( ( sizeof ( int ) - 1 ) << 3 ) ) & 0xff )
P62
#include <stdio.h>
int int_shifts_are_arithmetic ( ) {
int test = - 1 ;
return ! ( test^ ( test>> 1 ) ) ;
}
int main ( ) {
printf ( "%d" , int_shifts_are_arithmetic ( ) ) ;
return 0 ;
}
P63
#include <stdio.h>
unsigned srl ( unsigned x, int k) {
unsigned xsra = ( int ) x>> k;
int w = sizeof ( int ) << 3 ;
int mask = ( int ) - 1 << ( w- k) ;
return xsra& ( ~ mask) ;
}
int sra ( int x, int k) {
int xsrl = ( unsigned ) x>> k;
int w = sizeof ( int ) << 3 ;
int mask = ( int ) - 1 << ( w- k) ;
int mmask = ( int ) - 1 << ( w- 1 ) ;
mask = mask& ( ! ( mmask& x) - 1 ) ;
return xsrl| mask;
}
int main ( ) {
unsigned testu = 0x12345678 ;
int testi = 0x12345678 ;
printf ( "%x\n" , srl ( testu, 2 ) ) ;
printf ( "%x\n" , sra ( testi, 2 ) ) ;
}
P64
#include <stdio.h>
int any_odd_one ( unsigned x) {
int mask = 0xAAAAAAAA ;
return ! ( x& mask) ;
}
int main ( ) {
int test = 0xAA11 ;
printf ( "%d" , any_odd_one ( test) ) ;
}
P65
#include <stdio.h>
int odd_ones ( unsigned x) {
x= x^ ( x>> 16 ) ;
x= x^ ( x>> 8 ) ;
x= x^ ( x>> 4 ) ;
x= x^ ( x>> 2 ) ;
x= x^ ( x>> 1 ) ;
return x& 0x1 ;
}
int main ( ) {
unsigned test1 = 0x10100001 ;
unsigned test2 = 0x00001010 ;
printf ( "%d\n" , odd_ones ( test1) ) ;
printf ( "%d\n" , odd_ones ( test2) ) ;
}
P66
#include <stdio.h>
int leftmost_one ( unsigned x) {
x | = x >> 1 ;
x | = x >> 2 ;
x | = x >> 4 ;
x | = x >> 8 ;
x | = x >> 16 ;
return ( x >> 1 ) + ( x && 1 ) ;
}
int main ( ) {
printf ( "%x\n" , leftmost_one ( 0x6600 ) ) ;
return 0 ;
}
P67
A 32位机器最多只能移位31位,否则位“未定义”
B
#include <stdio.h>
int int_size_is_32 ( ) {
int set_msb = 1 << 31 ;
int beyond_msb = set_msb<< 1 ;
return set_msb && ! beyond_msb;
}
#include <stdio.h>
int int_size_is_32 ( ) {
int set_msb = 1 << 1 << 4 << 5 << 1 << 4 << 1 << 1 << 4 << 5 << 1 << 4 ;
int beyond_msb = set_msb<< 1 ;
return set_msb && ! beyond_msb;
}
P68
#include <stdio.h>
int lower_one_mask ( int n) {
int w = sizeof ( int ) << 3 ;
return ( unsigned ) - 1 >> ( w- n) ;
}
int main ( ) {
printf ( "%x\n" , lower_one_mask ( 17 ) ) ;
}
P69
#include <stdio.h>
unsigned rotate_left ( unsigned x, int n) {
int w = sizeof ( int ) << 3 ;
return ( x<< n) | ( x>> ( w- n- 1 ) >> 1 ) ;
}
int main ( ) {
printf ( "%x\n" , rotate_left ( 0x12345678 , 4 ) ) ;
printf ( "%x\n" , rotate_left ( 0x12345678 , 20 ) ) ;
}