• CSAPP:第二章 2.1练习题答案


    自己做的答案,还没对照过参考答案。有些题太简单,就没做了。

    2.1~2.4

       

    2.5

    int val = 0x87654321

      

    小端

    大端

    存储序列

    21 43 65 87

    87 65 43 21

    show_bytes(valp, 1)/*A.*/

    21

    87

    show_bytes(valp, 2)/*B.*/

    21 43

    87 65 

    show_bytes(valp, 3)/*C.*/

    21 43 65

    87 65 43

       

    2.6 A

    3510593 = 0x00359141 =  1101011001000101000001b

    3510593.0 = 0x4a564504 = 1001010010101100100010100000100

    B

           1101011001000101000001b

    1001010010101100100010100000100b

       

    2.7

    const char* s = "abcdef";

    字符串没有大小端的问题,所以内存里面是61 62 63 64 65 66

    strlen返回的是长度,不是size所以不包括结束符,那么输出就是61 62 63 64 65 66

       

    2.8 2.9

    2.10

      

    *x

    *y

    初始

    a

    b

    step 1

    a

    a^b

    step 2

    a^(a^b) ->b

    a^b

    step 3

    b

    b^(a ^ b) ->a

       

    2.11

    A: firstlast的值相等了,为k

    B:对于xor_swap这个函数,xy是不能够指向同一个地址的. 首先就是个未定义行为.

    可以参看 http://c-faq.com/expr/xorswapexpr.html 

    其次就算不是未定义行为,比如说C语言严格规定了求值得顺序也一样会出现问题,第一步就把xy变成0

    C:修改为for(first = 0, last = cnt; first < last, first++, last--)就可以了。

       

    2.12

    #include <limits.h>

    #define MASKA1 0xFF         /*assume char size is 8 bits*/

    #define MASKA2 UCHAR_MAX /*The value UCHAR_MAX shall equal 2CHAR_BIT - 1.*/

    #define MASKB (~MASKA2) /* generate 0xFFFFFF00 in 32bits */

    #define MASKC UCHAR_MAX

    int main()

    {  

            unsigned int x = 0x87654321;

            unsigned int a = x & MASKA2;

            unsigned int b = x ^ MASKB;

            unsigned int c = x | MASKC;

           printf( "%x %x %x\n", a,b,c);

             

        return 0;

    }

    如果不假设Byte都是8bit的话,最好使用已经有的C语言macro UCHAR_MAX,以保证移植性

       

    2.13

    直接看代码吧

    int bis(int x, int m){
            return x | m;
    }
    int
     bic(int x, int m){
            return x & (~m);
    }
    int
     bool_or(int x, int y){
            return bis(x, y);
    }
    int
     bool_xor(int x, int y){
            int a = bic(x,y);
            int b = bic(y,x);
            return bis(a,b);
    }

    2.14

    2.15

    int equal(int x, int y){

            return !(x ^ y);

    }

    2.16

       

  • 相关阅读:
    JVM字节码-字节码进阶
    JVM字节码-Class文件结构
    CT03 Contest#10 equation 大力打表+讨论
    2021CT03 Contest#9 降智场
    妙妙题 noi.ac 2323 Connecting
    洛谷 P4774 [NOI2018] 屠龙勇士
    [模板] 扩展中国剩余定理
    洛谷 P1082 [NOIP2012 提高组] 同余方程
    洛谷 P1516 青蛙的约会
    2021牛客暑期多校训练营3 Kuriyama Mirai and Exclusive Or
  • 原文地址:https://www.cnblogs.com/aoaoblogs/p/2783278.html
Copyright © 2020-2023  润新知