日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言按位取反原理

發(fā)布時間:2025/3/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言按位取反原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正數(shù)取反是先將初始數(shù)值轉(zhuǎn)換成二進制數(shù)(6==》00000110),再對二進制數(shù)的每一位取反:即將0變?yōu)?、將1變?yōu)?。(00000110==》11111001),得到的是最終結果的補碼,要轉(zhuǎn)換為最終結果的原碼則需再次取補碼,就能得到計算結果;負數(shù)取反是先將初始數(shù)值轉(zhuǎn)換成二進制數(shù)(以-6為例,10000110),再取得二進制數(shù)的補碼,之后對補碼的每一位取反:即將0變?yōu)?、將1變?yōu)?。得到的是最終結果的補碼,要轉(zhuǎn)換為最終結果的原碼則需再次取補碼,就能得到計算結果。

補碼:正數(shù)的補碼等于它的原碼;負數(shù)的補碼等于反碼+1

# include <stdio.h> int main() { unsigned char a=18,b;b=~a;printf(“~a=%d”,b); return 0; }

運行結果為: ~a= 237

#include <stdio.h> int main() { char a=18,b; b=~a;printf(“~a=%d”,b); return 0; }

運行結果:-19

注意:

前一個程序結果很好理解,后一個因為a是帶符號數(shù)據(jù),因此~a=(11101101)2的結果是一負數(shù)的補碼,轉(zhuǎn)換為原碼時,第1位符號位不變,對剩余的部分先減1,再全部取反,因此得到的二進制原碼為:10010011,即十進制的-19。

在計算機中操作的是補碼
對6取反(~6)
6的原碼 0000 0000 0000 0000 0000 0000 0000 0110
6的反碼 0000 0000 0000 0000 0000 0000 0000 0110
6的補碼 0000 0000 0000 0000 0000 0000 0000 0110
計算機只能對補碼操作,那么對6取反(~6),實際操作的是補碼,每位取反
6的補碼全部取反 1111 1111 1111 1111 1111 1111 1111 1001 (得到的這個數(shù)是最高為代表負數(shù))
補碼–>反碼 -1 1111 1111 1111 1111 1111 1111 1111 1000
反碼–>原碼 取反 1000 0000 0000 0000 0000 0000 0000 0111
故~6=-7

已知補碼如何求原碼(真值)~
正數(shù)的補碼反碼與原碼相同。

若已知補碼為 1111 1000,如何求其原碼呢?

(1)方法1:求負數(shù) 原碼--->補碼 的逆過程。

????????注意:符號位保持不變!

????(A)先 - 1,得到 1111 0111

????(B)取反(符號位保持不變,其他位置按位取反?),得到?1000 1000

(2)方法2:

????????注意:符號位保持不變!

????(A)將這個二進制數(shù)中(即 1111 1000),除了符號位,其余位置按位取反,得 1000 0111

????(B)+ 1,得到 1000 1000

總結:
????????-1 后,再取反???和 取反后,再+1??的效果是一樣的。

???????這就和??-(3-1)??和 (-3 +1)?是一個道理。
?

?

?

?

?

總結

以上是生活随笔為你收集整理的C语言按位取反原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。