深入理解位移運算符

一、左移運算符

左移運算符(<<)是將一個數的二進制位向左移動指定的位數,並用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/zh-hant/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

發表回復

登錄後才能評論