www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 原創(chuàng) > 振南技術(shù)干貨集(風(fēng)云錄)
[導(dǎo)讀]我給大家出一道有意思的題目:如何快速得到一個字節(jié)的位逆序字節(jié)。比如0X33的位逆序字節(jié)是0XCC。

字節(jié)快速位逆序

我給大家出一道有意思的題目:如何快速得到一個字節(jié)的位逆序字節(jié)。比如0X33的位逆序字節(jié)是0XCC。

有人給了我這樣一段代碼:

這段代碼很簡潔,也很巧妙。但是它卻不是最快的。后來作了改進:

這樣把循環(huán)打開,確實會提速不少。但它仍不是最快的實現(xiàn)方案。請看如下代碼:

恍然大悟了沒有?使用字節(jié)數(shù)組事先準備好位逆序字節(jié),然后直接以字節(jié)的值為下標索引,直接取數(shù)據(jù)即可。這種方法被稱為“空間換時間”。

這個問題我問過很多人,多數(shù)人并不能直接給出最佳方案。倒是有不少人問我這個問題有什么實際意義,為什么要去計算位逆序字節(jié)?請大家想想,如果我們把電路上的數(shù)據(jù)總線焊反或插反了該怎么解決。

關(guān)于volatile

現(xiàn)在的編譯器越來越智能,它們會對我們的代碼進行不同程度的優(yōu)化。請看下例:

unsigned char a;

a=1;

a=2;

a=3;

這樣一段代碼,有些編譯器會認為a=1與a=2根本就是毫無意義,會把它們優(yōu)化掉,只剩下a=3。但是,有些時候這段代碼是有特殊用途的:

unsigned charxdata a _at_ 0X1111;

a=1;

a=2;

a=3;

a不單單是一個變量,而是一個外部總線的端口(51平臺)。向它賦值會產(chǎn)生相應(yīng)的外部總線上的時序輸出,從而對外部器件實現(xiàn)控制。這種時候,a=1和a=2不能被優(yōu)化掉。舉個例子:a所指向的外部總線端口,是一個電機控制器的接口,向它寫入1是加速,寫入2是減速,寫入3是反向。那么上面的代碼就是加速->減速->反向,這樣一個控制過程。如果被優(yōu)化的話,那最后就只有反向了。

為了防止這種被“意外”倫的情況發(fā)生,我們可以在變量的定義上加一個修飾詞volatile。

volatile unsigned charxdata a _at_ 0X1111;

a=1;

a=2;

a=3;

這樣,編譯器就會對它單獨對待,不再優(yōu)化了。

volatile最常出現(xiàn)的地方,就是對芯片中寄存器的定義,比如STM32固件庫中有這樣的代碼:

#define __IO volatile

typedef struct

{

__IO uint32_t CRL;

__IO uint32_t CRH;

__IO uint32_t IDR;

__IO uint32_t ODR;

__IO uint32_t BSRR;

__IO uint32_t BRR;

__IO uint32_t LCKR;

} GPIO_TypeDef;

這是對STM32的GPIO寄存器組的定義,每一項都是一個__IO類型,其實就是volatile。這樣是為了對片內(nèi)外設(shè)的物理寄存器的訪問一定是真正落實的,而不是經(jīng)過編譯器優(yōu)化,而變成去訪問緩存之類的東西。

聲明:該篇文章為本站原創(chuàng),未經(jīng)授權(quán)不予轉(zhuǎn)載,侵權(quán)必究。
換一批
延伸閱讀

在C語言中,volatile關(guān)鍵字通過約束編譯器優(yōu)化行為,為多線程編程、硬件寄存器訪問等場景提供底層語義支持。其核心作用在于解決變量值可能被外部因素(如硬件、中斷、其他線程)修改時,編譯器優(yōu)化導(dǎo)致的內(nèi)存訪問不一致問題。這...

關(guān)鍵字: C語言 volatile

CPU的大小端模式?是指在存儲和處理多字節(jié)數(shù)據(jù)時,字節(jié)的順序是如何排列的。它涉及到字節(jié)在內(nèi)存中的存儲方式以及讀取和解釋這些字節(jié)的順序。主要有兩種大小端模式:?大端模式(Big-Endian)?和?小端模式(Little-...

關(guān)鍵字: CPU 字節(jié)

最新消息,近日字節(jié)跳動 CEO梁汝波在2024年年度全員會上表示,2019-2021年,字節(jié)跳動快速擴張,員工數(shù)量從1萬多增加到10萬多人,不少人反饋現(xiàn)在字節(jié)該有的大公司病全有了。同時強調(diào)該公司今年的關(guān)鍵詞為“始終創(chuàng)業(yè),...

關(guān)鍵字: CEO 梁汝波 字節(jié)

業(yè)內(nèi)消息,近日有消息稱字節(jié)跳動調(diào)整了薪酬結(jié)構(gòu),將原來年終獎月數(shù)大于3的薪酬方案統(tǒng)一調(diào)整為3個月,也就是說年薪總包不變,月薪上升幅度約20%。官方在通知郵件中表示,此舉主要是為提升管理效率。

關(guān)鍵字: 字節(jié) 期權(quán) 激勵

最新消息,針對「字節(jié)跳動旗下游戲部門朝夕光年正與騰訊談判出售多款游戲」一事,昨天晚間朝夕光年相關(guān)負責(zé)人回應(yīng)稱,相關(guān)團隊還在與多個買家商談項目出售事宜,至今尚未敲定任何與騰訊的交易。

關(guān)鍵字: 朝夕光年 騰訊 游戲 字節(jié)

memcpy函數(shù)的功能是用來作內(nèi)存搬運,就是將數(shù)據(jù)從一個數(shù)組賦值到另一個數(shù)組。它的實現(xiàn)很簡單:

關(guān)鍵字: memcpy C 語言 串化

初學(xué)C語言的時候,有一個小編程題我們應(yīng)該都記得,就是變量互換。

關(guān)鍵字: 變量互換 sizeof C 語言

補碼是一個很基礎(chǔ)的概念,但是對于很多人來說,其實有些迷糊,這里對補碼進行一些通俗而深刻的講解。

關(guān)鍵字: C 語言 補碼 CPU

另外,有時候優(yōu)先級還與C語言編譯器有關(guān),同一個表達式在不同的平臺上,可能表達的意義是不同的。所以,為了代碼的可植移性、正確性以及可讀性,振南強烈建議多用一些()。

關(guān)鍵字: C 語言 編程語言 賦值操作

我們本希望循環(huán)5次,然后結(jié)束,但是實際情況是陷入了死循環(huán)。這種錯誤在實際開發(fā)中,還比較難發(fā)現(xiàn)。其原因在于i的類型,無符號整型是永遠不小于0的。我們需要將i的類型改為有符號型。

關(guān)鍵字: 死循環(huán) C 語言 空循環(huán)
關(guān)閉