LSB最低有效位和MSB最高有效位
最低有效位(the least significant bit,lsb)是指一個二進制數字中的第0位(即最低位),具有權值為2^0,可以用它來檢測數的奇偶性。與之相反的稱之為最高有效位。在大端序中,lsb指最右邊的位。
圖1 無符號數149的二進制形式,藍色為最高有效位
?? 最低有效位代表二進制數中的最小的單位,可以用來指示數字很小的變化。
?? LSB(全大寫)有時也指Least Significant Byte,指多字節序列中最小權重的字節。
?? 最高有效位(the Most Significant Bit,msb),是指一個n位二進制數字中的n-1位,具有最高的權值2^n ? 1。與之相反的稱之為最低有效位。在大端序中,msb即指最左端的位。
圖2?無符號數149的二進制形式,藍色為最高有效位
?? ?對于有符號二進制數,負數采用反碼或補碼形式,此時msb用來表示符號,msb為1表示負數,0表示正數。
?? ?MSB(全大寫)有時也指the Most Significant Byte,指多字節序列中具有最大權重的字節。
參考資料:維基百科
-================================================
Most Significant Bit, Last(Least) Significant Bit
最高有效位(MSB)?
指二進制中最高值的比特。在16比特的數字音頻中,其第1個比特便對16bit的字的數值有最大的影響。例如,在十進制的15,389這一數字中,相當于萬數那1行(1)的數字便對數值的影響最大。比較與之相反的“最低有效位”(LSB)。
MSB高位前導,LSB低位前導。
談到字節序的問題,必然牽涉到兩大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big?endian方式存儲數據,而x86系列則采用little?endian方式存儲數據。那么究竟什么是big?endian,什么又是little?endian呢?
?????其實big?endian是指低地址存放最高有效字節(MSB),而little?endian則是低地址存放最低有效字節(LSB)。
?????用文字說明可能比較抽象,下面用圖像加以說明。比如數字0x12345678在兩種不同字節序CPU中的存儲順序如下所示:
Big?Endian
???低地址????????????????????????????????????????????高地址
???----------------------------------------->
???+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
???|?????12?????|??????34????|?????56??????|?????78????|
???+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little?Endian
???低地址????????????????????????????????????????????高地址
???----------------------------------------->
???+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
???|?????78?????|??????56????|?????34??????|?????12????|
???+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
?????從上面兩圖可以看出,采用big?endian方式存儲數據是符合我們人類的思維習慣的。而little?endian,!@#$%^&*,見鬼去吧?-_-|||
?????為什么要注意字節序的問題呢?你可能這么問。當然,如果你寫的程序只在單機環境下面運行,并且不和別人的程序打交道,那么你完全可以忽略字節序的存在。但是,如果你的程序要跟別人的程序產生交互呢?在這里我想說說兩種語言。C/C++語言編寫的程序里數據存儲順序是跟編譯平臺所在的CPU相關的,而J***A編寫的程序則唯一采用big?endian方式來存儲數據。試想,如果你用C/C++語言在x86平臺下編寫的程序跟別人的J***A程序互通時會產生什么結果?就拿上面的0x12345678來說,你的程序傳遞給別人的一個數據,將指向0x12345678的指針傳給了J***A程序,由于J***A采取big?endian方式存儲數據,很自然的它會將你的數據翻譯為0x78563412。什么?竟然變成另外一個數字了?是的,就是這種后果。因此,在你的C程序傳給J***A程序之前有必要進行字節序的轉換工作。
?????無獨有偶,所有網絡協議也都是采用big?endian的方式來傳輸數據的。所以有時我們也會把big?endian方式稱之為網絡字節序。當兩臺采用不同字節序的主機通信時,在發送數據之前都必須經過字節序的轉換成為網絡字節序后再進行傳輸。ANSI?C中提供了下面四個轉換字節序的宏。
·BE和LE一文的補完
我在8月9號的《Big?Endian和Little?Endian》一文中談了字節序的問題,原文見上面的超級鏈接。可是有朋友仍然會問,CPU存儲一個字節的數據時其字節內的8個比特之間的順序是否也有big?endian和little?endian之分?或者說是否有比特序的不同??
?????實際上,這個比特序是同樣存在的。下面以數字0xB4(10110100)用圖加以說明。?
Big?Endian
???msb?????????????????????????????????????????????????????????lsb
???---------------------------------------------->
???+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
???|???1??|???0??|???1??|???1??|???0??|???1??|???0??|???0??|
???+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little?Endian
???lsb?????????????????????????????????????????????????????????msb
???---------------------------------------------->
???+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
???|???0??|???0??|???1??|???0??|???1??|???1??|???0??|???1??|
???+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
?????實際上,由于CPU存儲數據操作的最小單位是一個字節,其內部的比特序是什么樣對我們的程序來說是一個黑盒子。也就是說,你給我一個指向0xB4這個數的指針,對于big?endian方式的CPU來說,它是從左往右依次讀取這個數的8個比特;而對于little?endian方式的CPU來說,則正好相反,是從右往左依次讀取這個數的8個比特。而我們的程序通過這個指針訪問后得到的數就是0xB4,字節內部的比特序對于程序來說是不可見的,其實這點對于單機上的字節序來說也是一樣的。?
?????那可能有人又會問,如果是網絡傳輸呢?會不會出問題?是不是也要通過什么函數轉換一下比特序?嗯,這個問題提得很好。假設little?endian方式的CPU要傳給big?endian方式CPU一個字節的話,其本身在傳輸之前會在本地就讀出這個8比特的數,然后再按照網絡字節序的順序來傳輸這8個比特,這樣的話到了接收端不會出現任何問題。而假如要傳輸一個32比特的數的話,由于這個數在littel?endian方存儲時占了4個字節,而網絡傳輸是以字節為單位進行的,little?endian方的CPU讀出第一個字節后發送,實際上這個字節是原數的LSB,到了接收方反倒成了MSB從而發生混亂。
轉自:?http://jelline.blog.sohu.com/156470626.html
http://www.cnblogs.com/shuaifeng/archive/2009/12/23/1630195.html
總結
以上是生活随笔為你收集整理的LSB最低有效位和MSB最高有效位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习笔记(五)——朴素贝叶斯分类
- 下一篇: hadoop回收站