• C语言位操作不用中间变量交换两数值


    1、使用加法与减法交换两数值:

     #define SWAP(a, b) ((&(a) == &(b)) || \
                    (((a) -= (b)), ((b) += (a)), ((a) = (b) - (a))))

    这种交换数值a与b的方法没有使用临时变量,初始化检测a,b,如果在同一内存区,则被忽略,当然这通常不会发生,(编译器会忽略,然而无论如何都是一种优化),假如可以确

    定溢出异常,于是传递无符号数异常就不会抛出。

    下面的逻辑“或”运算的方法在某些机器上可能要快一些,不要使用浮点型数字。

    2、使用逻辑“或”方法交换两数值:

     #define SWAP(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))

    3、使用逻辑“或”方法交换独立位:

    1 unsigned int i, j; 
    2 unsigned int n;    
    3 unsigned int b;    
    4 unsigned int r;   
    5 
    6 unsigned int x = ((b >> i) ^ (b >> j)) & ((1U << n) - 1); // XOR temporary
    7 r = b ^ ((x << i) | (x << j));

    其中:b为目标数字,以二进制的形式表示,从最右边比特位开始计算,标号为0,i指向第i+1个比特位,

    n指连续比特位的个数,j指向第j+1个比特位,r保存交换后的值。

    e.g. b = 00101111   n=3,i=1,j=5

           r = 11100011

    C测试代码如下:

    #include <stdio.h>
    #include <string.h>
    
    void tranlate(int n)  //十进制转换为二进制
    {
        int a[1000];
        int i,L,j;
        i=L=0;
        while(n/2){
            a[i]=n%2;
            n/=2;
            L++,i++;
        }
        a[i]=1;
        while(L<8){    //设置为显示8位的二进制
            a[++i]=0;
            L++;
        }
        for(j=L-1; j>=0; j--){
            printf("%d",a[j]);
        }
        printf("\n");
    }
    
    
    int main(int argc, char *argv[])
    {
        unsigned int i, j; 
        unsigned int n;    
        unsigned int b;   
        unsigned int r;    
        b=47,n=3,i=1,j=5;
        tranlate(b);
        unsigned int x = ((b >> i) ^ (b >> j)) & ((1U << n) - 1); 
        r = b ^ ((x << i) | (x << j));
        tranlate(r);
        getchar();
        getchar();
        return 0;
    }
  • 相关阅读:
    zabbix 对/etc/ssh/sshd_config文件的监控 但status为unknowen
    Kotlin从零到精通Android开发
    谷歌官方 构建您的第一个应用 Kotlin版
    android studio 运行按钮为灰色的解决办法之一
    webapi发布到windows 2012的iis8里 出错
    Asp.net MVC WebApi项目的自动接口文档及测试功能打开方法
    Asp.net Web Api开发(第四篇)Help Page配置和扩展
    关于SNMP的MIB文件的语法简述
    Visual Stdio 2017增加SVN支持
    ffmpeg 多个音频合并 截取 拆分
  • 原文地址:https://www.cnblogs.com/cpoint/p/3367376.html
Copyright © 2020-2023  润新知