• C语言位运算题解


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    //#define NONBLANK 1
    main()
    {
        /* 位运算 */
        int n;
        printf("开始启动程序:
    ");
        printf("开始调用函数:
    ");
        int setbits(int, int, int, int);
        int result = setbits(10, 4, 3, 3);
        printf("结果等于%d", result);
        system("pause");
        return 0;
    }
    /* 将x中从p开始右边的n位设置为y中右边n位的值,返回结果 */
    int setbits(int x, int p, int n, int y)
    {
        int old_x = x & ~(~0 << p-n+1);  //先将x中移出去的那p-n+1位保存起来
        /*  为了方便,这里先以16位为例
            以10举例:0000 0000 0000 1010
            x=10, p=4, n=3, y=2
            因为位数是从右往左数,并且从0开始,所以右移的时候,p-n要加上1才对
            old_x:也就是 0000 0000 0000 0010
        */
        int new_x = (x >> p - n + 1) | ~(~0 << n);  //x中除了p位开始到右边n位,其余位保持不变,如何保持不变?“和1与”、“和0或”都能保持不变
        // new_x = 0000 0000 0000 0010 | 0000 0000 0000 0111
        // new_x = 0000 0000 0000 0111  ----再把y的值变成除了右边n位不变,其余位都变成1,这样new_x和y按位与就得出结果了
        //注意:如果想和y按位或,就得让new_x右边n位都是0才行。这样得出的结果和上面的一样。但是后面的处理可能更麻烦一些。
        int new_y = y | (~0 << n);
        int result = new_x & new_y;
        result = result << p - n + 1;   //恢复原来的位置
        result = result | old_x;  //最终结果
        return result;
    }

    这是C语言书中的一道题。

  • 相关阅读:
    你所不知道的 CSS 阴影技巧与细节
    %date~0,4%和 %time~0,2%等用法详解
    计算程序执行时间
    GDI
    IO
    字符串拼凑批量Insert SQL语句神BUG
    用逗号分隔的数据转换到数组
    MVC ViewBag传值
    接口和抽象类对比
    Partial 同一个命名空间下写两个类名一样的类
  • 原文地址:https://www.cnblogs.com/bneglect/p/11885919.html
Copyright © 2020-2023  润新知