深入理解位移运算符

一、左移运算符

左移运算符(<<)是将一个数的二进制位向左移动指定的位数,并用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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JBIW的头像JBIW
上一篇 2024-10-04 00:16
下一篇 2024-10-04 00:16

相关推荐

  • 条件运算符(?:)是什么意思?

    条件运算符(?:)是JavaScript中的一种特殊的运算符,也是许多编程语言中相似语法的一部分。它可以允许我们在一个简单、一行的语句中完成条件判断和赋值操作,非常方便。 1.语法…

    编程 2025-04-29
  • Python按位运算符和C语言

    本文将从多个方面详细阐述Python按位运算符和C语言的相关内容,并给出相应的代码示例。 一、概述 Python是一种动态的、面向对象的编程语言,其按位运算符是用于按位操作的运算符…

    编程 2025-04-29
  • Python中赋值运算符和相等运算符解析

    Python是一种高级编程语言,它通常被用于开发 Web 应用程序、人工智能、数据分析和科学计算。在Python中,赋值运算符和相等运算符是非常常见和基本的运算符,它们也是进行编程…

    编程 2025-04-28
  • Python中的算数运算符优先级问题

    本文将从多个方面详细阐述Python中算数运算符的优先级问题,并给出对应代码示例。算数运算符的优先级指的是在混合运算时,Python自动根据一定的优先级顺序决定哪一个运算符先进行。…

    编程 2025-04-28
  • Python比较运算符

    Python中的比较运算符有六个,分别是等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。本篇文章将从以下几个方面详…

    编程 2025-04-27
  • Python逻辑运算符优先级

    本篇文章将从多个方面对Python逻辑运算符优先级进行详细阐述,包括优先级规则、优先级示例及代码实现等内容。 一、优先级规则 在Python中,逻辑运算符的优先级从高到低依次为“n…

    编程 2025-04-27
  • 异或Python:用异或运算符增强Python编程能力

    Python是一种高级编程语言,被广泛应用于Web开发、数据分析等领域。Python提供了丰富的数据类型和函数库,但在某些情况下,Python自带的运算符可能不够灵活,无法满足程序…

    编程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25

发表回复

登录后才能评论