C语言的位操作(Two)

作者: 遮天的龙 | 来源:发表于2016-06-21 21:43 被阅读172次

    一、位运算赋值运算符

    闲话就不多说,直接上图咯。

    位运算赋值运算符

    二、位运算应用

    **eg:取一个整数a从右端开始的4~7位并输出 **

       #include <stdio.h>
        int main()
       {
           unsigned short a,b,c,d;      //声明字符型变量
          scanf("%o",&a);
          b=a>>4;           //右移运算
          c=~(~0<<4);           //取反左移后再取反
          d=b&c;                    //按位与
          printf("%o\n%o\n",a,d);
          return 0;
      }
    
      <——---------------------------->
      输入的八进制数是1640,
      转换为2进制数是:0000 0011 1010 0000,
      获取其右端开始的4到7位是二进制数1010,转换为八进制就是12。
    

    思路:
    (a)、 先使a右移4位;
    (b)、 设置一个低4位全为1,其余全为0的数,可用(0<<4);
    (c)、 将上面二者进行&运算。

    此题核心思想的图片

    三、异或加密

    除了上节说到的“无参交换”,此处也是位操作的一处比较有技术的应用。

    •  位运算的加密应用,这才是真正意义上的加密的开始。
      
    • 解决了,加减法加密溢出的问题。

    循环移位加密

    void encode(char *secret)  //加密
    {
        int n = strlen(secret);
        for(int i=0; i<n; i++)
          {
            unsigned char ch = secret[i];
            ch = 0xff & (((ch &(1<<7))>>7) |(ch<<1));  
              secret[i] = ch;
          }
    } 
    void decode(char *secret)  //解密
    {
        int n = strlen(secret);
        for(int i=0; i<=n; i++)
        {
          unsigned char ch = secret[i];
          ch = 0xff & (((ch&1)<<7) |(ch>>1));
          secret[i] = ch;
        }
    }
    int main()
    {
          char buf[] = "I am caijinlong”;             
          encode(buf);
          printf("%s\n",buf);
          decode(buf);
          printf("%s\n",buf);
          return 0;
    }
    

    相关文章

      网友评论

      • 罗友烫烫子:请问最后加密的例子能具体讲解一下吗?不是很理解为什么decode函数的那一行是encode函数的逆运算
        罗友烫烫子:@老五的幸福 哦哦,谢谢了
        老五的幸福:@罗友烫烫子 就是把每个字节的第7位移到第0位 解密的时候再移动回来

      本文标题:C语言的位操作(Two)

      本文链接:https://www.haomeiwen.com/subject/mwmgdttx.html