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