• #C语言初学记录(位运算)


    位运算

    Problem Description7-1 数组元素循环右移问题
    一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0
    ​​A​1⋯A​N−1)变换为(A​N−M​​ ⋯A​N−1​​ A​0​​ A​1​​ ⋯A​N−M−1​​ )(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

    输入格式:
    每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

    输出格式:
    在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

    输入样例:
    6 2
    1 2 3 4 5 6
    输出样例:
    5 6 1 2 3 4

    运行程序

    
     #include<stdio.h>
      
    void swap(int a[], int low, int high)
    {
        while(low<high){
            a[low]^= a[high]^= a[low]^= a[high];
            low++;
            high--;
        }
    }
     
    int main(void)
    {
        int M,N;
        scanf("%d",&N);
        scanf("%d",&M);
        int a[N];
        int m= M%N;
        for(int i= 0; i< N; i++)
            scanf("%d",a+i);
        swap(a,0,N-1);
        swap(a,0,m-1);
        swap(a,m,N-1);
        for(int i= 0; i< N-1; i++)
            printf("%d ",a[i]);
        printf("%d",a[N-1]);
          
    }
    

    位运算相关
    百度百科:****按位异或的异或符号是^。按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0.
    xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥。1314520 xor 19880516 = 20665500,我就把20665500告诉MM。MM再次计算20665500 xor 19880516的值,得到1314520。相同位不同则为1,相同则为0。

    若需要交换两个变量的值,除了通常使用的借用中间变量进行交换外,还可以利用异或,仅使用两个变量进行交换,如:

    void swap(int &a,int &b)
    {
        a=a^b;
        b=b^a;
        a=a^b;
    }
    

    AND

    void swap(int &a,int &b)
    {
    a^= b^= a^=b;
    }
    
  • 相关阅读:
    运行时权限
    访问其他程序中的数据
    第二篇T语言实例开发(版本5.3),福彩3D摇号器
    第一篇T语言实例开发(版本5.3),带错误检测的加减乘除运算器
    第九课,T语言数组的定义与访问(版本5.0)
    第八课,T语言功能和参数(版本5.0)
    第七课第六节,T语言流程语句( 版本5.0)
    第七课第五节,流程语句(版本5.0)
    第七课第四节,T语言流程语句(版本5.0)
    第七课第三节,T语言流程语句(版本5.0)
  • 原文地址:https://www.cnblogs.com/xiaofengqaq/p/10644747.html
Copyright © 2020-2023  润新知