在VB6中實作的“移位操作”,可能大家在網上也看到了不少的代碼。不過,大多數實作方法都是運行效率極低的。當
然,也有一些“好點”的代碼,可惜要么只能在編譯后有效(在IDE環境中運行仍然用的“算術運算”模擬的),要么實作方
法比較繁瑣(要用到幾個 Virtual**** 系列的API ,看到這些API我就擔心“意外”導致失敗)。
我這兒說的“行內匯編代碼”嚴格說來是不恰當的,只是多數人都習慣這樣說而已。術語應該是叫“Thunk Code”。
不過,這個問題不是重點,我沒必要討論如何“稱呼”更準確,糾結這些沒有實質意義。
在這兒,我公布一份實作簡單、運行高效的代碼。無論在IDE中,還是在編譯后,都是執行“硬體操作指令”進行移位
操作的,總體來說比在VB6中用“算術運算模擬”要快好幾十倍。
代碼很簡短,在“原理”方面沒什么好“解釋”的。有足夠知識的,自然看得懂是怎么回事;看不懂的也沒關系,只
要在“用得上的地方”會正確使用就行了,并不是非要知道原理才行。
移位操作函式總共是8個,具體的可以閱讀一下我前一次發的關于移位操作的帖子,在這兒就不多說了。函式的入口參
數用Long型別,我是出于“適應性最廣”的考慮,并且我發覺函式引數“傳4位元組”似乎并沒有比傳2位元組或1位元組慢。所有
介面函式的“引數說明”,其實我都是有注釋的,聰明的人一定能看到,呵呵……
介面模塊定義如下:
' *****************************************************************
' ** **
' ** 運用 【行內機器碼 + 輕量級物件】 實作移位操作 **
' ** **
' ** - * - * - * - * - * - * - * - * - * - **
' ** 參考型別庫: VB6移位操作介面物件庫 ( BitLib.tlb ) **
' *****************************************************************
' 原始碼創作: Chen8013 〖 (C)著作權所有 〗
' E-mail : [email protected]
' 發布日期: 2018年2月4日
'
' 使用說明:
' ⑴ 工程必須“參考”型別庫 BitLib.tlb ,否則不能運行、不能編譯。
' ⑵ 先呼叫一次 CreateIBit() 程序(一般在“程式入口”處呼叫)。
' 此程序只需要呼叫一次即可(反復“呼叫”也沒問題),理論上不會失敗。
' ⑶ 需要進行“移位操作”的地方,通過 IBit 物件來呼叫相應的操作函式。
' ⑷ 移位操作函式的入口引數,都是 ByVal傳遞的;函式回傳值為操作結果。
Option Explicit
' ==============================
' ≡ API 函 數 聲 明 ≡
' ==============================
Private Declare Sub PutMem4 Lib "MSVBVM60" (pDest As Any, ByVal NewVal As Long)
' ==============================
' ≡ 自定義 資料型別 ≡
' ==============================
Private Type ObjData ' 定制輕量級“物件核心資料”
pVTable As Long
cRefs As Long
End Type
Private Type LW_VTable ' 定制輕量級“物件虛函式表”
fpIUnknown As Long
fpAddRef As Long
fpRelease As Long
LongSHL As Long
LongSHR As Long
LongROL As Long
LongROR As Long
IntSHL As Long
IntSHR As Long
IntROL As Long
IntROR As Long
uReserved As Long ' 保留成員(未用)
End Type
Private Type ASM_Code
ASM(0 To 3) As Long
End Type
' ==============================
' ≡ 常量 & 變數 宣告 ≡
' ==============================
Private m_VTable As LW_VTable ' 仿制“虛函式表”
Private m_Object As ObjData ' 仿制“物件資料”
Private m_COM_StdFun As ASM_Code ' 標準介面函式代碼
Private m_CodeLongSHL As ASM_Code
Private m_CodeLongSHR As ASM_Code
Private m_CodeLongROL As ASM_Code
Private m_CodeLongROR As ASM_Code
Private m_CodeIntSHL As ASM_Code
Private m_CodeIntSHR As ASM_Code
Private m_CodeIntROL As ASM_Code
Private m_CodeIntROR As ASM_Code
Private m_InitFlag As Long
'
' * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
Public IBit As IBit ' 全域物件變數:公用移位操作介面物件
' * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
' ==============================
' ≡ 公 共 接 口 函 數 ≡
' ==============================
Public Sub CreateIBit()
' 創建“移位操作介面物件”:理論上肯定成功
Dim stcASM As ASM_Code
' …………(略)詳見下圖…………
End Sub
核心代碼就1個標準模塊+1個tlb檔案。現在CSDN的資源都不免費了,我也就不用資源的方式來上傳了。下面的這張圖
片中,包含了一個簡單的示例工程(介面模塊和tlb檔案自然也在其中),把圖片“另存為……”xxx.rar檔案,就可以用
WinRAR(或其它支持的軟體)打開解壓了。

大家可以看到,這個代碼很簡短、精巧吧!

創建的COM物件,占用的全部空間還沒200位元組(這個“模塊”的代碼空間不算在內),夠“輕”的吧!
并且,你即使在IDE中直接點“停止”工具按鈕終止程式,也不會有“記憶體泄漏”的問題。
uj5u.com熱心網友回復:
TMD,“吃屎都難”真不是知道得了什么腦殘病!帖子中有特殊符號“黑色五角星”,“黑色方塊”(VB6的“停止”按鈕符號),就不讓我發出來……



uj5u.com熱心網友回復:
MD,代碼塊中,不是用“等寬字體”嗎!我的“對齊”的代碼,發出來居然沒對齊。
uj5u.com熱心網友回復:
看起來像天書。樓主適合做科研
uj5u.com熱心網友回復:
啥天書喲,你看,那一堆代碼,不就主要是些“賦值陳述句”嗎,很容易懂的嘛。
uj5u.com熱心網友回復:
夠輕,但是后續沒法維護,要跟接手的人講故事uj5u.com熱心網友回復:
不明白,我這個跟“后續維護”有多大關系?
就算“工程”讓其他人接手了,“維護”也是修改有問題的地方啊……
就算要“重新修改業務介面”,并且就算他不懂“移位操作”,那么他修改后的代碼自然也不會用到“移位”,
這也不至于造成了“沒法維護”的局面吧!

我這份代碼,只需要明白“做什么的、怎么使用”就行了,“原理”懂或不懂根本不是問題。
uj5u.com熱心網友回復:
有可能后面要做回圈位移、128位位移之類的……uj5u.com熱心網友回復:
這跟我的代碼能扯上關系啊!

我的代碼是有16位和32位的左移、右移(邏輯右移)、回圈移位(左和右)介面的。
你要想操作“超過32Bit”的資料,32位程式本身就不支持。
無論如何你都得“另外實作”操作介面的。
況且,直接用我這個“移位操作介面”組合出64位、128位的移位操作,肯定也比你用其它方法來“實作組合”的運行效率高啊。
uj5u.com熱心網友回復:
計算機組成原理→DOS命令→匯編語言→C語言(不包括C++)、代碼書寫規范→資料結構、編譯原理、作業系統→計算機網路、資料庫原理、正則運算式→其它語言(包括C++)、架構……《The Intel 64 and IA-32 Architectures Software Developer's Manual》
uj5u.com熱心網友回復:








uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
當年在學校里,用C51匯編實作單片機32位位移,以及32位加減乘除是作業。
話說,都用VB了,介意個別幾個匯編陳述句效率不多吧。介意的人都直接用C去了吧。
個別呼叫幾下,節省出來的時間沒感覺,大量呼叫的話介面呼叫的時間也費了不少吧。
再說了,現在真要折騰效率的單純CPU匯編都不夠了,上FPGA、CUDA、ASIC去了,像挖位元幣的搞深度學習的。
沒有貶低代碼的意思,只是討論實際應用場景。極客精神值得稱贊。
uj5u.com熱心網友回復:
我想測驗下 你的代碼咋樣,看了下,你的代碼發的不全呀uj5u.com熱心網友回復:
我想測驗下 你的代碼咋樣,看了下,你的代碼發的不全呀
亂說!
我的代碼(含“簡單應用示例”工程)都發出來了,還敢說我的“代碼不全”???
uj5u.com熱心網友回復:
我想測驗下 你的代碼咋樣,看了下,你的代碼發的不全呀
你認真看了我的帖子嗎?
在我的主貼后面部分,插入了一張圖片,
把那個圖片保存到你的的電腦中、再把擴展名改為“rar”(WinRAR壓縮檔案),
就可以用相應的軟體打開解壓了。
(我在主貼中已經說清楚了的)
uj5u.com熱心網友回復:
我想測驗下 你的代碼咋樣,看了下,你的代碼發的不全呀
你認真看了我的帖子嗎?
在我的主貼后面部分,插入了一張圖片,
把那個圖片保存到你的的電腦中、再把擴展名改為“rar”(WinRAR壓縮檔案),
就可以用相應的軟體打開解壓了。
(我在主貼中已經說清楚了的)
uj5u.com熱心網友回復:
你根本就沒有檔案連接,只是一張圖片面已uj5u.com熱心網友回復:
將一張png的圖保存成rar檔案,就成了rar檔案啦?我都覺得可笑,可笑你還是做程式開發的uj5u.com熱心網友回復:
將一張png的圖保存成rar檔案,就成了rar檔案啦?我都覺得可笑,可笑你還是做程式開發的
呵呵,可笑?
看到你這么無知,我也不想說什么了…………
uj5u.com熱心網友回復:
將一張png的圖保存成rar檔案,就成了rar檔案啦?我都覺得可笑,可笑你還是做程式開發的
孤陋寡聞
uj5u.com熱心網友回復:
比不用匯編 效率應該高不少uj5u.com熱心網友回復:
舉杯邀明月 對不起是我錯啦 我真不知道圖片可以下載壓縮檔案,我下載后是默認360壓縮解壓的 360確實是打不開,我今天查了一下,原來是將圖片和壓縮檔案再使用copy二進制方式壓縮后改成圖片名即可,可是為什么下載后改成rar,就是正常的rar檔案,那個壓縮進來的圖片不會對rar檔案造成破壞呢?uj5u.com熱心網友回復:
對不起大家,真是三人行必有我師,二十年的開發人員卻不知道這個,羞愧uj5u.com熱心網友回復:
舉杯邀明月 對不起是我錯啦 我真不知道圖片可以下載壓縮檔案,我下載后是默認360壓縮解壓的 360確實是打不開,我今天查了一下,原來是將圖片和壓縮檔案再使用copy二進制方式壓縮后改成圖片名即可,可是為什么下載后改成rar,就是正常的rar檔案,那個壓縮進來的圖片不會對rar檔案造成破壞呢?
剛才特意試了一下:二百五壓縮確實不能打開。
但是如果用的是 WinRAR,或者“好壓”(2345軟體的),是能正常識別的。
這種檔案有某些壓縮軟體“不能識別”的問題,我確實沒有太在意。
因為我的電腦中的壓縮軟體只有WinRAR(最常用)和cab壓縮(極少使用),
尤其是數字流氓的軟體,都是被我“拒絕”的,因此有“不能識別”的問題,算是個意外吧。
這種“特殊處理”的檔案,能不能被壓縮軟體識別,
我猜想(因為沒有去“探索”它們的實作細節)主要是跟“引擎”的程式撰寫有關吧。
如果它只是“簡單的識別一下”,這種“非標準”的檔案就肯定被認為是“不合法的壓縮檔案”了;
而那些“能夠識別”的軟體,應該是它進行了“仔細盤查”的原因吧。
uj5u.com熱心網友回復:
我想測驗下 你的代碼咋樣,看了下,你的代碼發的不全呀
按樓主說的,將圖片另存為rar,確實可以解壓。
uj5u.com熱心網友回復:
我想測驗下 你的代碼咋樣,看了下,你的代碼發的不全呀
按樓主說的,將圖片另存為rar,確實可以解壓。
呵呵,海鷗軟體(hsgzr1)開始用的壓縮軟體是數字流氓的,
那個破軟體確實打不開我那個“特殊處理的壓縮檔案”(看到 hsgzr1 的回復后才下載來試的)。
我從來不用250的東西,不知道會發生這種事。他認為我在“亂說”,這也不怪他。
uj5u.com熱心網友回復:
我電腦上沒有250的軟體,只有360.下次我要注冊一個WWW.250.COM,然后上傳很多軟體上去,歡迎大家到我的250網站下載工具
uj5u.com熱心網友回復:
我電腦上沒有250的軟體,只有360.
下次我要注冊一個WWW.250.COM,然后上傳很多軟體上去,歡迎大家到我的250網站下載工具
這種域名很貴,怕是買不起吧
uj5u.com熱心網友回復:
我電腦上沒有250的軟體,只有360.
下次我要注冊一個WWW.250.COM,然后上傳很多軟體上去,歡迎大家到我的250網站下載工具
這種域名很貴,怕是買不起吧
一級域名,肯定很貴的。

uj5u.com熱心網友回復:
我電腦上沒有250的軟體,只有360.
下次我要注冊一個WWW.250.COM,然后上傳很多軟體上去,歡迎大家到我的250網站下載工具
這種域名很貴,怕是買不起吧
一級域名,肯定很貴的。
三字域名都很貴,注冊商自己都會去加價賣,四字域名有時候撿個漏還有便宜的
uj5u.com熱心網友回復:
太高級了,反正我是沒看懂。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/46861.html
標籤:VB基礎類
