日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

格雷码(从零基础讲解,C++版)

發(fā)布時間:2024/1/1 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 格雷码(从零基础讲解,C++版) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

格雷碼題目講解(C++版)

  • 格雷碼簡介
  • 經(jīng)典例題
    • ??題目展示
    • ??題目講解
    • ??代碼解題

??小白在這胡說八道,有不足的地方歡迎大佬們斧正ˋ( ° ▽、° )

格雷碼簡介

詳解見百度百科,這里只敲重點淺談幾個方面

  • 優(yōu)點:自然二進制碼可以直接由數(shù)模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號,但在某些情況,例如從十進制的3轉(zhuǎn)換為4時二進制碼的每一位都要變,能使數(shù)字電路產(chǎn)生很大的尖峰電流脈沖。而格雷碼則沒有這一缺點,它在相鄰位間轉(zhuǎn)換時,只有一位產(chǎn)生變化,大大地減少了由一個狀態(tài)到下一個狀態(tài)時邏輯的混淆。
  • 核心:按規(guī)律的異或方法將格雷碼轉(zhuǎn)換成二進制,直到最低位
  • 應(yīng)用:智力玩具九連環(huán)、現(xiàn)代半導(dǎo)體工藝里的位元轉(zhuǎn)換(低功耗)、刻度標尺定位系統(tǒng)(檢測位置信息)
  • 經(jīng)典例題

    ??題目展示

    LeetCode - 使整數(shù)變?yōu)?0 的最少操作次數(shù)(題目編號:1611)
    level: Hard
    Subject:
    ??給你一個整數(shù) n(0 <= n <= 109),你需要重復(fù)執(zhí)行多次下述操作將其轉(zhuǎn)換為 0

  • 翻轉(zhuǎn) n 的二進制表示中最右側(cè)位(第 0 位)
  • 如果第 (i-1) 位為 1 且從第 (i-2) 位到第 0 位都為 0,則翻轉(zhuǎn) n 的二進制表示中的第 i 位。
  • 返回將 n 轉(zhuǎn)換為 0 的最小操作次數(shù)

    Example 1:
    輸入:n = 3
    輸出:2
    解釋:3 的二進制表示為 “11”
    “11” -> “01” ,執(zhí)行的是第 2 種操作,因為第 0 位為 1
    “01” -> “00” ,執(zhí)行的是第 1 種操作

    Example 2:
    輸入:n = 6
    輸出:4
    解釋:6 的二進制表示為 “110”.
    “110” -> “010” ,執(zhí)行的是第 2 種操作,因為第 1 位為 1 ,第 0 到 0 位為 0
    “010” -> “011” ,執(zhí)行的是第 1 種操作
    “011” -> “001” ,執(zhí)行的是第 2 種操作,因為第 0 位為 1
    “001” -> “000” ,執(zhí)行的是第 1 種操作

    ??題目講解

    ??仔細觀看題目需要執(zhí)行的操作,發(fā)現(xiàn)本質(zhì)上就是典型格雷碼的枚舉規(guī)則,我們可以翻譯題目需求為 “格雷碼需要向0方向枚多少次才變成0,即解碼成0”,本文講解的運算規(guī)則有枚舉、編碼、解碼

    • 枚舉 - 格雷碼從小變大遵循的規(guī)則
      1.第一步改變最右邊的位元(1變0,0變1)
      2.第二步改變右起第一個為1的位元的左邊位元(1變0,0變1)
      3.如此反復(fù)第一步、第二步
    • 枚舉 - 格雷碼從大變小遵循的規(guī)則
      1.第一步改變最右邊的位元(1變0,0變1)
      2.第二步改變右起第一個為1的位元的左邊位元(1變0,0變1)
      3.如此反復(fù)第一步、第二步
    • 編碼 - 二進制轉(zhuǎn)格雷碼
      原理:如果二進制碼字的第 i 位和 i+1 位(從右邊開始數(shù))相同,則對應(yīng)的格雷碼的第i位為0,否則為1(當i+1=n時,二進制碼字的第n位被認為是0,即第n-1位不變)
    /*編碼模板 */ #include <iostream> using namespace std;int gray_encode(int num) {return num ^ (num >> 1); // >>是位移運算符,^是異或運算符 }
    • 解碼 - 格雷碼轉(zhuǎn)換成二進制
      原理:從左邊第二位起,將每位與左邊一位解碼后的值進行異或,作為該位解碼后的值(最左邊一位依然不變),直到最低位。
    /*解碼模板 */ #include<math.h> // log對數(shù)函數(shù)需要用到的頭文件 #include <iostream> using namespace std;int gray_decode(int num) {int head;if(!num) return 0;head = 1 << int(log(num) / log(2)); //C++沒有直接以2為底的對數(shù),我們創(chuàng)造一個以2為底的對數(shù)return head + gray_decode((num^head) ^ (head>>1)); }

    ??代碼解題

    按上面的模板來說,第一種是直接套用“解碼”的模板

    /* 第一種模板 */ #include<math.h> // log對數(shù)函數(shù)需要用到的頭文件 #include <iostream> using namespace std;int gray_decode(int num) {int head;if(!num) return 0;head = 1 << int(log(num) / log(2));return head + gray_decode((num^head) ^ (head>>1)); }int main() {int n = 0;cin >> n;gray_decode(n); }

    第二種是較簡潔的模板(注解待完善)

    /* 第二種模板 */ #include <iostream> #include <cmath> using namespace std;int minimumOneBitOperations(int n) {int result = 0;while(n){result ^= n;n >>= 1; }return result; }int main() {int n = 0;cin >> n;minimumOneBitOperations(n); }

    路漫漫其修遠兮,吾將上下而求索

    總結(jié)

    以上是生活随笔為你收集整理的格雷码(从零基础讲解,C++版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。