欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

javascript補碼,編程求補碼

js中的位運算

在了解位運算之前, 必須先了解一下什么是原碼, 反碼和補碼, 以及二進制與十進制的轉(zhuǎn)換.

創(chuàng)新互聯(lián)公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的十多年時間我們累計服務(wù)了上千家以及全國政企客戶,如活動板房等企業(yè)單位,完善的項目管理流程,嚴格把控項目進度與質(zhì)量監(jiān)控加上過硬的技術(shù)實力獲得客戶的一致贊美。

原碼

一個數(shù)在計算機中是以二進制的形式存在的, 其中第一位存放符號, 正數(shù)為0, 負數(shù)為1. 原碼就是用第一位存放符號的二進制數(shù)值. 例如2的原碼為00000010, -2的原碼為10000010

反碼

正數(shù)的反碼是它本身, 負數(shù)的反碼是在其原碼的基礎(chǔ)上, 符號位不變, 其余各位取反.

可見如果一個反碼表示的是負數(shù), 并不能直觀的看出它的數(shù)值, 通常要將其轉(zhuǎn)換成原碼再計算

補碼

正數(shù)的補碼是它本身, 負數(shù)的補碼是在其原碼基礎(chǔ)上, 符號位不變, 其余各位取反, 最后+1. (即負數(shù)的補碼為在其反碼的基礎(chǔ)上+1)

可見對于負數(shù), 補碼的表示方式也是讓人無法直觀的看出其數(shù)值的, 通常也需要轉(zhuǎn)換成原碼再計算.

正整數(shù)十進制轉(zhuǎn)二進制

正整數(shù)的十進制轉(zhuǎn)二進制的方法為將一個十進制數(shù)除以2, 得到的商再除以2, 以此類推知道商為1或0時為止, 倒序取得除得的余數(shù), 即為轉(zhuǎn)換所得的二進制數(shù).

負整數(shù)十進制轉(zhuǎn)二進制

負整數(shù)的十進制轉(zhuǎn)二進制, 先將該負整數(shù)對應(yīng)的正整數(shù)轉(zhuǎn)為二進制, 然后對其取反再+1. 即補碼的形式

十進制小數(shù)轉(zhuǎn)二進制

十進制小數(shù)轉(zhuǎn)二進制的方法為"乘2取整", 對十進制的小數(shù)部分乘2, 得到的整數(shù)部分即是相應(yīng)的二進制碼數(shù), 然后繼續(xù)對得到的小數(shù)部分乘2, 如此不斷重復(fù), 直到小數(shù)部分為0或達到精度要求為止. 順序取得每次的整數(shù)部分, 即是該十進制小數(shù)的二進制表示.

按位運算符有6個

: 按位與

|: 按位或

^: 按位異或

~: 按位取反

: 右移

: 左移

將運算數(shù)以二進制表示, 對應(yīng)位都為1, 則結(jié)果為1, 否則為0.

使用場景示例:

判斷一個數(shù)是奇數(shù)還是偶數(shù)

奇數(shù)的二進制碼的最后一位數(shù)肯定是1, 而1只有最后一位為1, 按位與運算后, 結(jié)果肯定只有最后一位數(shù)是1. 而偶數(shù)的二進制表示的最后一位數(shù)是0, 和1進行按位與運算, 結(jié)果的所有位都是0.

將運算數(shù)以二進制表示, 對應(yīng)位有一個為1, 則結(jié)果為1, 否則為0.

使用場景示例:

對浮點數(shù)向下求整

其實浮點數(shù)是不支持位運算的, 所以會先把小數(shù)位丟棄, 然后以整數(shù)進行位運算, 而任何數(shù)與0進行按位或操作, 結(jié)果都是它本身, 就好像是對浮點數(shù)向下求整.

將運算數(shù)以二進制表示, 對應(yīng)位相同為0, 相異為1.

異或滿足交換律和結(jié)合律, 數(shù)字與它本身進行異或操作, 得到0; 數(shù)字與0進行異或操作, 得到它本身.

使用場景示例:

交換兩個變量數(shù)字的值

將操作數(shù)轉(zhuǎn)換為二進制數(shù), 然后按位求反.

浮點數(shù)是不支持位運算的,所以會先直接去除小數(shù)部分,轉(zhuǎn)成整數(shù)再進行位運算,就好像是對浮點數(shù)向下求整.

~~可以進行類型轉(zhuǎn)換,位運算會默認將非數(shù)字類型轉(zhuǎn)換成數(shù)字類型再進行運算 (轉(zhuǎn)換結(jié)果為整數(shù) 直接去除小數(shù)部分)

使用場景示例:

類型轉(zhuǎn)換

移位運算符將操作數(shù)轉(zhuǎn)換成二進制, 然后向左或向右移動, 超過的位丟棄, 空出的位補0.

使用場景示例:

類型轉(zhuǎn)換

任何小數(shù) 把它 0可以取整

如3.14159 0 = 3;

其默認將非數(shù)字類型的轉(zhuǎn)換為數(shù)字類型再做運算的性質(zhì)與 ~~ , | 0 一樣

>> 0 談?wù)?js 中的位運算'>js >>> 0 談?wù)?js 中的位運算

這不就是無符號右移嘛,當時第一感覺是是為了取絕對值,后來發(fā)現(xiàn)并不是,嘗試了多次之后,發(fā)現(xiàn)情況有點詭異啊,我們使用 chrome 調(diào)試工具運行一下 js 中的無符號右移 0 位。

不僅是 null 無符號右移會變成 0 , js 中的其他非數(shù)值做此運算都會變成 0 。

接下來我們來看看為什么會這樣(事實上不僅僅只是無符號右移是這樣)。要理解這個問題需要先明白什么是位運算以及為什么需要位運算,然后搞明白 js 中的位運算有什么特別之處。

敬請期待

(這一部分我是拿 java、go 與 js 做對比的。)

這在 java、go、c 中都是不被允許的

細心的人已經(jīng)發(fā)現(xiàn),基本類型里并沒有浮點型。

事實上在 js 中的 Number 類型是不區(qū)分 int、long、float、double 類型的( go 的用戶們就呵呵一笑了,來來來,我們的浮點型就能王炸你)。回正題,不區(qū)分整型、浮點型那怎么存儲呢,為了不丟失精度, js 中的 Number 類型實際上一個基于 IEEE 754 標準的雙精度64位浮點數(shù)( java 的同學就把它當成 double 看)。看到這我想很多人應(yīng)該能明白為什么 js 里浮點數(shù)也能參與位運算了吧。這也是沒有辦法,因為對于內(nèi)存來說整型、浮點型都沒有區(qū)別了。

這里是有一個問題的,因為當 js 需要進行位運算時,會將操作數(shù)通通轉(zhuǎn)成 32 位比特序列(0,1),也就是補碼。操作完成之后,再按照 64 位浮點數(shù)存儲

直接丟棄!!! 曾吶!這么虎?

沒錯,就是這么暴力,那么問題來了,既然小數(shù)部分不參與位運算,那么為什么不能像 java、go 那樣直接禁止呢?關(guān)于這個問題,我想那就是語言設(shè)計者的想法,我就不知道了。但是這其實也帶來了一些特別的操作,比如在 js 中雙取反是可以做取整操作的。

當 js 需要進行位運算的時候,對于非數(shù)值類型,會首先將操作數(shù)轉(zhuǎn)成一個整型(就是0)然后在進行運算。這就解釋了為什么 js 中可以允許非數(shù)值類型參與運算,其實這是個偽命題,因為實質(zhì)上是對非數(shù)值操作數(shù)的整型表達式進行的位運算。

這里需要注意,上面說過了 js 中的整型在內(nèi)存中都是一個 64 位雙精度浮點型,但是 js 進行位運算時,會將操作數(shù)轉(zhuǎn)成帶符號位的 32 位比特序列(0,1),也就是補碼。運算結(jié)束后,再按照 64 位存儲。那么問題來了,這里肯定會存在精度丟失對吧,這應(yīng)該不難理解。 js 確實也是這樣處理的,超過 32 位的部分直接截斷。

所以對一個非數(shù)值變量做取反操作,得到的一定是 -1,因為實際上等于對 0 做取反操作。

首尾呼應(yīng)一下,畢竟就是這個問題使我查資料寫了這篇文章。

首先解釋一下, 無符號右移原本是 java 里特有的(這里是和 js、go 對比,其他語言我沒用過,不能亂說)。 js 中的無符號右移跟 java 幾乎一樣,除了一點兩種語言處理方式完全不一樣。

那就是并沒有真正發(fā)生移位的情況下,符號位會不會被替換成0。 java 中是不會替換的,但是 js 中是會發(fā)生替換的。

當操作數(shù)是正數(shù)的時候,不管有沒有真的移位并沒有區(qū)別,因為正數(shù)的符號位是 0。

當操作數(shù)是負數(shù)時,移動位數(shù)大于0,也體現(xiàn)不出區(qū)別:

但是當操作數(shù)是負數(shù),無符號右移 0 位時,區(qū)別就大了:

這是因為 -1 的補碼是:

0 實際上并沒有發(fā)生數(shù)位變化,但是 js 卻會把符號位替換成 0,

此時原來負數(shù)的補碼,變?yōu)榱苏龜?shù)的源碼(這就是為什么 js 中 -10 會變成一個巨大的正整數(shù))。

js 中無符號右移時,不管正數(shù)、負數(shù)都會首先將符號位替換成 0,然后再進行移位。也就是說,該運算符永遠返回正整數(shù)。

js 的位運算,為什么會有這么多奇怪的地方呢?我相信很多同學都會有這種想法,特別是 java 的同學們吧。為此我查了 js 的歷史。

1995 Sun 公司正式發(fā)布 java 語言,當時的網(wǎng)景公司正在為它們的 Navigator 瀏覽器尋找一種網(wǎng)頁腳本(此前的瀏覽器不具備互動能力)。當他們看到 Sun 公司的宣傳后,與 Sun 合作開發(fā)全新的腳本語言 javascript 。此前我一直不明白 js 既然不是 java 的腳本,為什么叫這個名字。現(xiàn)在懂了,因為當時新腳本語言的決策中, Sun 公司占了很大一環(huán)。

1995年5月 按照公司的要求(一個像 java 但是比 java 簡單的腳本語言), Brendan Eich 僅用10天就寫出了 javascript 。

在我們膜拜大神的時候,也要認清一個現(xiàn)實,當時給 Brendan Eich 的時間太短了,所以很多問題并沒有很好的解決,而且一邊模仿 java、c ,一邊還要簡化數(shù)據(jù)類型、內(nèi)存模型。我覺得這就是為什么 js 的位運算這么奇怪的原因。

js 完全套用了 java 的位運算符。

但是 java 的位運算是針對整數(shù)的,對 js 沒什么用啊,因為 js 中,所有數(shù)字都保存為雙精度浮點型。如果使用它們的話, js 不得不將操作數(shù)先轉(zhuǎn)為整數(shù),然后再進行運算。

所以很多人不建議在 js 中使用位運算,理由是 js 天生就會進行類型轉(zhuǎn)換,使得效率降低。

javascript 取補什么意思

取補即取補碼,二進制范疇的補碼,是一種二進制編碼

javascript 取補是“位運算 NOT(~)”

當前文章:javascript補碼,編程求補碼
文章URL:http://chinadenli.net/article16/dsgecgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計網(wǎng)站營銷面包屑導(dǎo)航動態(tài)網(wǎng)站網(wǎng)站收錄定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)