最近重新?lián)炱餋語言,發(fā)現(xiàn)很多知識點一知半解(以前學的很拉跨,都是囫圇吞棗,不求甚解的學習態(tài)度)。對按位取反操作運算的原理不是很清楚,網(wǎng)上看了很多講解,講的不是很清晰,只有一篇看著講的很好:點擊此處跳轉。接下來,按照兩種方法講一下按位取反。
快捷使用一種簡單粗暴得到答案:
簡單算出結果的公式:
設目標數(shù)為:X
則取反結果:~X = -(X+1)
另一種是原理詳解:
補充說明舉例驗證:1.十進制 → 2.二進制原碼 → 3.二進制補碼 → 4.按位取反 → 5.二進制原碼 → 6.十進制
即:對(十進制)目標值X,先將其轉為二進制表示,然后將轉為其補碼形式(正數(shù)和負數(shù)的補碼有區(qū)別),之后對補碼按位取反(包括符號位)(結果仍是補碼),最后將取反后的補碼轉為其原碼。最終得到結果十進制。
1. 十進制 :6。
2. 二進制原碼:0 0110。//(第一個0 表示符號位)
3. 二進制補碼:0 0110。
4. 按位取反 :1 1001。
5. 二進制原碼:1 0111。//(這里是對負數(shù)二進制轉原碼操作:減一、取反。下面是過程詳解)
5.1. 減一:1 1000;
5.2. 取反:1 0111。//(符號位不取反,即結果和5中一樣)
6. 十進制 :-7.
補充 :第4步按位取反后為 第5步 負數(shù)補碼情況:上述是進行反向操作(減一,取反)。
還有一種方法是:直接加一。最高位補一。如下:(我個人覺得沒問題)
1. 十進制 :6。
2. 二進制原碼:0 0110。//(第一個0 表示符號位)
3. 二進制加一:0 0111。
4. 高位補一 :1 0111。
5. 十進制 :-7.
1. 十進制 :-6。
2. 二進制原碼:1 0110。//(第一個1 表示符號位)
3. 二進制補碼:1 1010。//(這里是對負數(shù)二進制轉補碼操作:取反、加一)
3.1. 取反:1 1001;
3.2. 加一:1 1010。//(符號位不取反,即結果和 3中一樣)
4. 按位取反 :0 0101。
5. 二進制原碼:0 0101。
6. 十進制 :5。
代碼驗證
#includeint main(void) {int a=6;
printf("~a: %d\n",~a);
printf(" a: %d\n",~-a);
return 0;
}
程序輸出結果:
以上是個人學習過程中的總結,轉載需注明出處。歡迎交流。
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧