什么是原码、反码、补码?什么是按位与?范围数字按位与!
前言:學過計算機基礎的大家都知道什么是二進制,什么是“與”運算,這里先給大家復習一下。
舉一個簡單的例子:
5的二進制表示是0101(補齊4位)
7的二進制表示是0111(補齊4位)
那么5&7=多少呢?
這里給大家普及一下與計算的規則:
- 參與運算的兩個數均以補碼出現
- 只有對應的兩個二進位都為1時,結果位才為1
上面提到的補碼是什么呢??
二進制計算有三種“碼”——原碼、反碼、補碼👇
1.原碼
就是我們上面的那種符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值. 比如如果是8位二進制:
負0101
原碼:1000 0101
正0101
原碼:0000 0101
2.反碼
正數的反碼是其本身
負數的反碼是在其原碼的基礎上, 符號位不變,其余各個位取反.
負0101
原碼:1000 0101
反碼:1111 1010
正0101
原碼:0000 0101
反碼:0000 0101
3.補碼
正數的補碼就是其本身
負數的補碼是在其原碼的基礎上, 符號位不變, 其余各位取反, 最后+1. (即在反碼的基礎上+1)
負0101
原碼:1000 0101
反碼:1111 1010
補碼:1111 1011
正0101
原碼:0000 0101
反碼:0000 0101
補碼:0000 0101
對上面的5和7,都是正數,所以原碼=反碼=補碼,我們按位進行一個比較,相等則取1,不相等則取0,那么我們得到的結果就是0101 即5。
至此,原反補已介紹完畢!👆
接下來,我們對按位與進行一個深入了解👇
在力扣上有一道練習題201 數字范圍按位與,題目如下:
給定范圍 [m, n],其中 0 <= m <= n <= 2147483647,返回此范圍內所有數字的按位與(包含 m, n 兩端點)。
示例 1:
輸入: [5,7]
輸出: 4
示例 2:
輸入: [0,1]
輸出: 0
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/bitwise-and-of-numbers-range
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
由題目我們可以看出,此題不只是我們用補碼計算的按位與,而是一個范圍的數字的按位與
此題何解?👇
當一個數+1時,總會有這么一個規律“某一位后的數字,全部被置為相反數”。舉個例子:010111 + 1 = 011000,則010111 & 011000 = 010000。那么,x & (x+1) 后幾位相反數的“與操作”,結果總為0。
所以,當(m,m+1,...n-1,n)進行連續“與操作”時,會按照上述規律被抵消很大一部分,而只剩下n的前綴部分,最后只需將n歸位。
用這個例子應該可以大概明白上面一段話的含義:
m = 5(0101), n = 7 (0111)。不停右移,得到n前綴部分為01,最后歸位前綴得res=0100=4
即右移至前幾位相等,然后再對右移后的數進行相同次數的左移,即可得到按位與的結果
public class _201_數字范圍按位與 {public int rangeBitwiseAnd(int m, int n) {int offset = 0;for (; m != n; ++offset) {m >>= 1;n >>= 1;}return n << offset;}
}
以上!
總結
以上是生活随笔為你收集整理的什么是原码、反码、补码?什么是按位与?范围数字按位与!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最优的去重处理——HashSet去重
- 下一篇: 不占用多余空间实现值的交换——异或运算