C語言位運算計算規則
- 一、負數右移
- 二、負數左移
- 三,正數右移
- 四,正數左移
- 五,負數取反 ~
- 六,正數取反 ~
- 七,^運算
- 八,&運算
- 九,| 運算
- 總結
一、負數右移
代碼如下(示例):
#include<stdio.h>
int main() {
printf("%d\n", -15>>2);
retrun 0;
}
/*
1 負數右移
原碼 10000000 00000000 00000000 00001111
反碼 11111111 11111111 11111111 11110000
補碼 11111111 11111111 11111111 11110001 >>2 (高位補齊符號位)
變化后的補碼 11111111 11111111 11111111 11111100 -1
變化后的反碼 11111111 11111111 11111111 11111011
變化后的原碼 10000000 00000000 00000000 00000100 -4
*/
二、負數左移
代碼如下(示例):
#include<stdio.h>
int main(){
printf("%d\n", -15 << 2);
return 0;
}
/*2 負數左移
原碼 10000000 00000000 00000000 00001111
反碼 11111111 11111111 11111111 11110000
補碼 11111111 11111111 11111111 11110001 <<2 (高位向左移動包括符號位,右端補0)
變化后的補碼 11111111 11111111 11111111 11000100 -1
變化后的反碼 11111111 11111111 11111111 11000011
變化后的原碼 10000000 00000000 00000000 00111100 -60
*/
三,正數右移
代碼如下(示例):
#include<stdio.h>
int main(){
printf("%d\n", 15>>2);
return 0;
}
/*3 正數右移
原碼 00000000 00000000 00000000 00001101 (正數的原碼就是補碼)
補碼 00000000 00000000 00000000 00001101 >>2
改變后的補碼 00000000 00000000 00000000 00000011
改變后的原碼 00000000 00000000 00000000 00000011 3
*/
四,正數左移
代碼如下(示例):
#include<stdio.h>
int main(){
printf("%d\n", 15 << 2);
return 0;
}
/*4 正數左移
原碼 00000000 00000000 00000000 00001111 (正數的原碼就是補碼)
補碼 00000000 00000000 00000000 00001111 <<2
改變后的補碼 00000000 00000000 00000000 00111100
改變后的原碼 00000000 00000000 00000000 00111100 60
*/
五,負數取反 ~
代碼如下(示例):
#include<stdio.h>
int main(){
printf("%d\n", ~-15);
return 0;
}
/*5 負數取反
原碼 10000000 00000000 00000000 00001111
反碼 11111111 11111111 11111111 11110000
補碼 11111111 11111111 11111111 11110001 ~取反
取反后的補碼 00000000 00000000 00000000 00001110 取反后補碼變成正數 故此時的補碼就為原碼
取反后的原碼 00000000 00000000 00000000 00001110 14
*/
}
六,正數取反 ~
代碼如下(示例):
#include<stdio.h>
int main(){
printf("%d\n", ~15);
return 0;
}
/*6 正數取反
原碼 00000000 00000000 00000000 00001111
補碼 00000000 00000000 00000000 00001111 ~取反 (正數的補碼就是原碼)
取反后的補碼 11111111 11111111 11111111 11110000
取反后的反碼 11111111 11111111 11111111 11101111
取反后的原碼 10000000 00000000 00000000 00010000 -16
*/
七,^運算
#include<stdio.h>
int main(){
printf("%d",15 ^ -15);
return 0;
}
/*7 ^運算
15原碼 00000000 00000000 00000000 00001111
15補碼 00000000 00000000 00000000 00001111
-15原碼 10000000 00000000 00000000 00001111
-15反碼 11111111 11111111 11111111 11110000
-15補碼 11111111 11111111 11111111 11110001
^ 11111111 11111111 11111111 11111110 ^位異或 相同為0 不同為1
^反碼 11111111 11111111 11111111 11111101
^原碼 10000000 00000000 00000000 00000010 -2
*/
八,&運算
#include<stdio.h>
int main(){
printf("%d",15 & -15);
return 0;
}
/*8 &運算
15原碼 00000000 00000000 00000000 00001111
15補碼 00000000 00000000 00000000 00001111
-15原碼 10000000 00000000 00000000 00001111
-15反碼 11111111 11111111 11111111 11110000
-15補碼 11111111 11111111 11111111 11110001
& 00000000 00000000 00000000 00000001 兩個補碼比較一方為0就是0 兩者同為1就是1
&原碼 00000000 00000000 00000000 00000001 1
*/
九,| 運算
#include<stdio.h>
int main(){
printf("%d",15 | -15);
return 0;
}
/*9 |運算
15原碼 00000000 00000000 00000000 00001111
15補碼 00000000 00000000 00000000 00001111
-15原碼 10000000 00000000 00000000 00001111
-15反碼 11111111 11111111 11111111 11110000
-15補碼 11111111 11111111 11111111 11110001
| 11111111 11111111 11111111 11111111 兩個補碼比較1方為1就是1,雙方為0就是0
|的反碼 11111111 11111111 11111111 11111110
|的原碼 10000000 00000000 00000000 00000001 -1
*/
總結
正數的原碼就是補碼 一切都是在補碼上發生變化,之后再回傳原碼讀取數值,如果這個數為負數就需要除符號位取反變反碼,+1變補碼,如果為正數,則直接用原碼=補碼進行計算,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/236585.html
標籤:其他
下一篇:光學仿真2020-12-09
