《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));
}