深入理解位移运算符

一、左移运算符

左移运算符(<<)是将一个数的二进制位向左移动指定的位数,并用0在右边填充结果。例如,10(二进制数1010)左移2位得到40(二进制数101000)。

#include
using namespace std;
int main()
{
   int a = 10;  // 二进制表示为 1010
   int b = a << 2;  // 左移2位得到 101000,即十进制数40
   cout << b << endl;  // 输出40
   return 0;
}

可以看到,左移运算符可以用于将一个数乘以2的幂。

二、右移运算符

右移运算符(>>)是将一个数的二进制位向右移动指定的位数,并用0或1在左边填充结果。当数是正数时,使用0填充;当数是负数时,使用1填充。例如,10的二进制位为1010,右移2位得到0010,即十进制数2;-10的二进制位为11110110,右移2位得到11111101,即十进制数-3。

#include
using namespace std;
int main()
{
   int a = 10;  // 二进制表示为 1010
   int b = a >> 2;  // 右移2位得到 10,即十进制数2
   cout << b <> 2;  // 右移2位得到 11111101,即十进制数-3
   cout << d << endl;  // 输出-3
   return 0;
}

可以看到,右移运算符可以用于将一个数除以2的幂。

三、位运算与指针运算

位运算符可以用于对数据结构进行操作,例如对数组进行逐位操作。指针运算也可以被看作一种位运算,因为指针变量保存的是内存地址,内存地址又是以二进制形式表示的。

#include
using namespace std;
int main()
{
   int a[5] = {1,2,3,4,5};
   int* p = a;
   for(int i=0;i<5;i++)
   {
      *(p+i) <<= 1;  // 每个元素向左移动1位
      cout << *(p+i) << " ";  // 输出每个元素
   }
   cout << endl;
   return 0;
}

以上代码将数组a中的每个元素向左移动1位,并输出每个元素的值。

四、位运算与加密算法

使用位运算可以进行简单的加密算法,例如异或加密算法。异或运算符(^)可以在两个二进制位不同的情况下返回1,相同的情况下返回0。因此,可以将一个数据与一个密钥进行异或运算,得到密文。只有知道密钥的人才能将密文还原成原数据。

#include
using namespace std;
int main()
{
   int data = 1234;  // 原数据
   int key = 4321;  // 密钥
   int cipher = data ^ key;  // 对数据进行加密
   cout << "Original data: " << data << endl;
   cout << "Cipher: " << cipher << endl;
   int plain = cipher ^ key;  // 对密文进行解密
   cout << "Decrypted data: " << plain << endl;
   return 0;
}

以上代码演示了一个简单的异或加密算法,将数据与密钥进行异或操作,得到密文,再使用密钥对密文进行异或操作,得到原数据。可以看到,使用位运算可以进行简单的加密算法。

五、自我检验

现在,做一个自我检验,使用位移运算符编写一个程序,将一个给定的字符串进行加密,并输出密文。然后再将密文解密成原字符串。

#include
#include
using namespace std;
int main()
{
   string s = "Hello, world!";  // 原字符串
   int key = 123;  // 密钥
   string cipher;  // 密文
   for(int i=0;i<s.length();i++)
   {
      char c = s[i] ^ key;  // 对每个字符进行加密
      cipher += c;  // 将加密后的字符加入密文中
   }
   cout << "Original string: " << s << endl;
   cout << "Cipher: " << cipher << endl;
   string plain;  // 解密后的原字符串
   for(int i=0;i<cipher.length();i++)
   {
      char c = cipher[i] ^ key;  // 对每个字符进行解密
      plain += c;  // 将解密后的字符加入原字符串中
   }
   cout << "Decrypted string: " << plain << endl;
   return 0;
}

可以看到,以上代码将一个给定的字符串进行加密,并输出密文。然后再将密文解密成原字符串。使用位移运算符可以实现简单的加密算法和解密算法。

原创文章,作者:JBIW,如若转载,请注明出处:https://www.506064.com/n/136588.html

(0)
JBIWJBIW
上一篇 2024-10-04
下一篇 2024-10-04

相关推荐

  • Python ljust()

    python 中的ljust()函数通过用给定的最小长度填充指定的字符来帮助将字符串向左对齐。在缺少 fillchar 参数的情况下,空格被视为默认填充字符。 **string.l…

    编程 2024-10-03
  • jsp中添加调试代码(jsp页面调试方法)

    本文目录一览: 1、谷歌浏览器调试jsp 引入代码片段,如何调试 2、JSP的页面里面有JS的代码怎么调试 3、怎么调试jsp中的java代码 4、使用eclipse开发jsp,如…

    编程 2024-10-03
  • php168木马,PHP万能木马

    本文目录一览: 1、想要个空间建个小型的门户网站,空间要支持PHP+MYSQL数据库的。 2、CMS哪个最好? 3、做行业网站哪个cms最好 4、求一款网络扫描软件,可以找到三层设…

    编程 2024-10-03
  • 探究GitHub国内

    Github是全球最大的开源协作平台,拥有全球最大的代码仓库和开发者社区。但在中国,由于技术限制和监管问题,访问Github变得异常困难。本文将从多个方面对Github国内进行详细…

    编程 2024-10-09
  • javargb,javargb颜色输出

    本文目录一览: 1、请问各位高手,在java中,如何实现输入RGB值改变颜色? 2、给定一幅图像,用java读取每个像素的RGB三个颜色值 3、java实现提取图片每一点的RGB …

    编程 2024-10-03
  • python英汉互译data,python中英互译

    本文目录一览: 1、python 爬虫 data是什么意思 2、python字典如何实现英汉互译 3、python 中Data[1][0]/100是什么意思? 4、请问python…

    编程 2024-10-03
  • 关于channel://jsgexs的信息

    本文目录一览: 1、请问谁能给我潘玮柏、李弘基的资料 2、24个GE SFP/10 GE SFP+端口是什么意思 3、机械制图中CHANNEL 150*75*6.5/10是什么意思…

    编程 2024-10-03
  • python之父伸张正义的简单介绍

    本文目录一览: 1、Python的创造者是谁 2、python之父加盟微软Gudii,如何评价他的成就? 3、Python之父退休无聊加入微软!Python是怎样诞生的? 4、编程…

    编程 2024-10-03
  • CSS SVG Animation Opacity技术详解

    一、CSS动画(Animation) CSS动画(Animation)是指在HTML元素上通过CSS样式属性设置实现的动画效果,可以让网页内容以动态的方式展现。其基本原理是通过关键…

    编程 2024-10-04
  • oc命令要安装,如何安装ocx

    本文目录一览: 1、c4doc渲染器怎么安装 2、oc获取进程安装路径 3、oc怎么卸载重装 4、新手的OpenShift oc命令 5、oc渲染器安装方法 6、win7下如何配置…

    编程 2024-10-04

发表回复

登录后才能评论