《CSAPP》(第3版)答案(第二章)(一)

《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

  • A.
!~x
  • B.
!x
  • C.
!~(x | ~0xff)
  • D.
!((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;
}
  • C
#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));
}
发布了94 篇原创文章 · 获赞 69 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/swy_swy_swy/article/details/105052576