教我尊重位元寬度的第一個錯誤是一個不斷清除自身的許可標誌。我正在將位元遮罩寫入整數列,並且每次都會重置整個欄位。當我看到它時,原因很尷尬:我正在推理這些位,就好像它們住在 32 個插槽中一樣,但值已經被加寬,並且不在上游某個地方的流浪已經翻轉了我從未考慮過的位。我坐下來用計算器修復了它,計算器向我展示了實際寬度的實際位,而不是我印刷的整齊的十進制。本指南是關於這個習慣的,使用 二進制計算器 在 toolz。dev 上,為什麼要進行位元數學運算,這樣你就可以同時看到每個鹼基,從而節省數小時的猜測時間。
TL;DR: 二進位計算器對二進位、八進位、十進位或十六進位編寫的整數執行算術(加、減、乘、除)和位元運算(AND、OR、XOR、NOT、移位),並在所有四個基數中顯示結果一次。任何大小的算術都是精確的;按位運算取決於所選的位元寬度。這 二進制計算器 兩者都完全在您的瀏覽器中執行,並報告有符號和無符號的讀數以獲取位元結果。
什麼是二進位計算器?
二進位計算器是一種對二進位整數進行運算的工具,但有用的整數根本不限於二進位。您選擇您正在思考的二進位、八進位、十進位或十六進位基數,輸入您的數字,選擇一個操作,然後讀取答案。好的顯示每個基數同時出現該答案,因此您永遠不會運行單獨的轉換來檢查您得到的內容。
這一點重要的原因是低階工作不斷在鹼基之間交叉。顏色是十六進制,權限遮罩在頭部是二進制的,但在資料庫中是十進制的,網路值在一個配置中是八進制的,在另一個配置中是十進制的。在一個地方進行數學計算,所有表示形式都可見,可以消除一整類轉錄錯誤。您不會將十六進制值複製到十進制計算器中,並希望您先將其轉換正確。
在 toolz。dev 上,流程很短。選擇輸入基數。輸入第一個值。選擇一個操作。鍵入第二個值。結果以二進位、八進位、十進位和十六進位形式一起顯示,對於位元操作,它還顯示所選寬度的有符號讀數和位元佈局。
它支援哪些操作?
兩個族,保持它們正確就是整個遊戲。算術運算是加、減、乘、除和模。它們作用於真實的數值,因此它們的行為類似於普通數學,並且不關心位元寬度。除法傳回整數商並報告任何餘數,模只傳回餘數,這是人們最常向後獲得的區別。
按位運算為 AND、OR、XOR、NAND、NOR、XNOR、NOT,以及左右移位。它們作用於固定暫存器內的原始位,因此它們的答案完全取決於該暫存器的寬度。 AND、OR 和 XOR 是每天的三:AND 屏蔽位關閉,OR 設定位開啟,XOR 切換它們。否定形式 NAND、NOR 和 XNOR 是它們在寬度內的補碼。不要每一位都翻轉。這些移位將整個模式向左或向右移動多個位置,從而丟棄從末端掉落的位。
這是我在決定想要哪種心理模型時使用的快速心理模型:
| 操作 | 符號 | 家庭 | 典型用途 |
|---|---|---|---|
| 加/減 | + / - | 算術 | 普通整數數學,任何大小 |
| 乘/除 | × / 斜率 | 算術 | 除法報告商和餘數 |
| 模數 | 模組 | 算術 | 僅剩餘,例如環繞索引 |
| 和 | &放大器; | 按位 | 屏蔽位關閉,測試標誌 |
| 或者 | | | 按位 | 設定標誌,組合遮罩 |
| 異或 | ^ | 按位 | 切換位、廉價奇偶校驗和交換 |
| 不是 | ~ | 按位 | 反轉寬度內的每一位 |
| 左移/右移 | << />> | 按位 | 乘以或除以兩個包欄位的冪 |
為什麼我需要選擇一點寬度?
這個問題讓每個剛接觸位元數學的人都感到困擾,也是計算器最固執己見的問題。無論大小,算術都有一個明顯的答案:無論你想像它是一個位元組還是一個 64 位元字,五加三都是八。但位元 NOT 根本沒有答案,直到你知道有多少位元。 5 不等於 "翻轉每一位,"結果取決於是否有八位或六十四位可以翻轉。
移位與另一個方向具有相同的依賴性。將值移得足夠遠,位元就會從頂部邊緣移動。它們是否消失或環繞取決於暫存器大小。 C、Java、Go 或 Rust 中的固定寬度整數類型透過定義前面的寬度來回答這個問題:a uint8 是八位,a uint32 是三十二,每個位元操作都發生在那個盒子裡。計算器透過讓您選擇 8、16、32 或 64 位元來準確地反映這一點,因此結果與您的實際程式碼將產生的結果相匹配,而不是理想化的無限寬度抽象。
選擇錯誤的寬度不是捨入錯誤,而是不同的答案。 NOT of 5 是 250 分(八位)和 4294967290 分(三十二位)。兩者的寬度都是正確的,而另一個的寬度也不正確。養成設定寬度以匹配資料類型的習慣是該工具鼓勵的最有用的學科。
two's 補碼如何出現在結果中?
幾乎每個處理器都表示使用的有符號整數 二'補碼,計算器遵循相同的約定,因此其輸出與您的硬體相符。在二's 補碼中,暫存器的頂部位元帶有負權重,因此,如果將其視為無符號,則 11111010 的八位元模式讀作 250;如果將頂部位元讀作符號,則讀作 -6。
這就是為什麼該工具報告兩個讀數以獲得位元結果。當您不以八位中的五位運行時,您會得到位元模式 11111010。計算器顯示無符號值 250、有符號值 -6 和二進位佈局,因此您可以看到它們是以兩種方式解釋的相同位元。當程式碼中的有符號類型和無符號類型之間的值交叉時,雙重讀取正是您所需要的,這是"impossible"的經典來源。出現在日誌中的數字。
當算術結果為負數時,遵循相同的規則。從 5 中減去 12,真正的答案是 -7,計算器以帶有負號的小數形式顯示,而其二進制、八進制和十六進制形式使用 two' s-complement 模式在您選擇的寬度內,11111001 為八位。並排查看負值及其位元模式就是 " 的抽象概念;符號只是頂部位引用;最後點擊。
如何手動加或減二進制數,並在此處查看?
二進制加法遵循與十進制相同的進位規則,但字母較小。零加零是一,零加一是一進一,一加一加進一是一進一。所以 1010 加 1100 從右邊逐列工作:0+0 是 0,1+0 是 1,0+1 是 1,1+1 是 0 進 1,進成為前導位,給出 10110,即 22 十進制。將其打入計算器會立即在每個基數中確認它,這就是我重新學習面試或教給某人時檢查手算術的方式。
減法是二'補碼贏得保留的地方。計算機不是跨列借用,而是通過添加負數來減去負數,負數是通過反轉位並添加一個來形成的。您很少需要手動執行此操作,但這解釋了為什麼計算器可以乾淨地減去負數區域:5 減 12 變成 5 加上 2' s-12 的補碼,結果是上面描述的 -7 模式。如果您想在鹼基之間移動單一值而不對其進行任何數學計算,則 數目 基數轉換器 是配套工具,並且 二進制翻譯 處理將文字轉換為位元而不是進行算術的情況。
位元運算什麼時候真正重要?
比初學者預期的要多,並且在不明顯的地方;低級。&引用;權限系統是經典情況:一組打包成一個整數的標誌,其中您 OR 授予權限,並補充撤銷權限,AND 測試權限。功能切換、Unix 檔案模式和硬體暫存器映射都使用相同的模式。如果您曾經見過 0o755 等值或定義為的常數 1 << 3,你遇到了一些打包。
異或出現在廉價的技巧和真實的演算法中:切換一位、計算奇偶校驗和經典的免時間交換。移位乘法和除以 2 的冪比一般乘法快得多,並且它們將幾個小字段打包成一個單詞,這就是顏色值、網絡標頭和緊湊序列化格式保持較小的方式。我不斷地在堆疊中建立這些內容,從將角色標誌儲存為位元掩碼的 Laravel API 到從打包整數中讀取 RGBA 的 React 畫布。了解這些操作是一項小投資,可以在任何地方得到回報,我寫到了這些如何適合更廣泛的套件 開發人員生產力工具 一塊。
微妙的故障使得可見的計算器值得使用。以錯誤寬度應用的遮罩會默默地保留或刪除您不想要的位元。假設 32 位元在 64 處的移動表現不同。有符號值 AND 與無符號遮罩進行對比會產生一個看起來不可能的數字,直到您看到 two's-補碼位。在調整寬度時觀察位元佈局的變化會將這些錯誤從謎團變成明顯的錯誤。
這裡還有一個教學角度。當我向新人解釋位面具時,十進制數字是沒有用的:12 和10 是8 沒有任何意義,直到你排成1100 和1010 並觀看AND 只保留兩者均為1 的列。因為計算器在小數旁邊顯示二進制佈局,八進制和六進制,它不再是一條記憶規則,而是成為你可以看到的東西。對於移位也是如此,顯示左移一倍,同時滑動每一位,左一列將算術意義以單一數字永遠無法做到的方式連接到位級機制。
有哪些限制?我的資料是私有的?
算術方面實際上沒有大小限制。計算器使用 JavaScript's 大情報,一種標準化的任意精度整數類型 ECMAScript,因此將數字與數十位數字相加或相乘可以保持精確,不會出現靜默溢位。與基於普通浮點數的計算器相比,這是一個真正的優勢,普通浮點數的精度會超過大約十五位數字,並且根本無法精確地表示大整數。
位元側故意以您選擇的寬度為界,因為這就是重點:固定寬度操作僅在固定暫存器內有意義。如果您輸入的值大於寬度可以容納的值,計算器會將其減少到該寬度並警告您,因此截斷永遠不會悄悄發生。移位上限為正常最大值,因此失控的移位量無法掛起頁面。
在隱私方面,一切都在您的瀏覽器中運行。您輸入的任何內容都不會上傳、記錄或存儲,如果您在頁面加載後斷開與互聯網的連接,該工具將繼續工作。這比聽起來更重要:人們透過位元計算器運行的值通常是權限遮罩、令牌或硬體位址,他們寧願不貼到他們無法控制的伺服器中。如果您關心哪些工具將您的資料保存在您的電腦上,那麼 線上工具中的資料隱私 指南涵蓋如何將客戶端工具與打電話回家的工具區分開來。對於鄰近的低階工作, IEEE 754 轉換器 和 ascii 桌子 完善集合。
常見問題
如何新增兩個二進制數?
將輸入基數設為二進位,鍵入第一個數字,選擇"新增",鍵入第二個數字,然後讀取結果。例如,1010 加 1100 是 10110,該工具還顯示為十進制 22、八進制 26 和十六進制 16。任意長度的算術都是精確的。
算術運算和位元運算有什麼差別?
算術運算(加、減、乘、除、模)作用於真數值,與位元寬度無關。位元運算(AND、OR、XOR、NOT 和 Shift)作用於固定寬度暫存器內的原始位,因此它們的結果取決於您選擇 8、16、32 或 64 位元。
為什麼我需要選擇一點寬度?
NOT 和 Shift 操作只有在知道暫存器大小後才有定義的答案,因為它們取決於存在哪些位元以及哪些位元從末尾掉落。選擇 8、16、32 或 64 位元使計算器符合特定整數類型在真實程式語言中的行為。
計算器如何處理負面結果?
負算術結果以十進制減號顯示,其二進制、八進制和十六進制形式在所選寬度內使用 two's-補碼。對於位元結果,工具會報告無符號值和有符號的 two's-補碼值。
我可以混合基數嗎,例如將十六進制數加到十進制數上?
兩個運算元都在您選擇的單一基數中讀取,因此您不能在一次計算中混合基數。要組合十六進位和小數值,請先轉換其中一個,然後在同一基數中輸入兩個。結果始終顯示在所有四個基數中。
當我除法時計算器會做什麼?
除法傳回整數商,如果除法不精確,工具會將餘數報告為註釋。要自行取得餘數,請使用 Modulo 操作,該操作僅傳回餘數。
數字能有多大?
算術使用 JavaScript BigInt,因此具有數十個數字的數字可以精確處理而不會溢出。位元運算受所選寬度的限制;超過它的值會減少到該寬度,當這種情況發生時,工具會警告您。
我的資料發送到任何地方嗎?
不。您的瀏覽器中的每個計算都以 JavaScript 形式運行。您輸入的任何內容都不會被傳輸、記錄或存儲,如果您在頁面加載後斷開與互聯網的連接,該工具將繼續工作。
自己用免費的東西試試數學 二進制計算器. 它完全在瀏覽器中處理二進位、八進位、十進位和十六進位的算術和位元運算,不上傳任何內容。



