C [3] 運算符 - 位運算、取反、左右移
示例:
#include <stdio.h>
int main()
{
//滔Roy 2021.11.01
//位運算 & | ^
unsigned int a = 1;
unsigned int b = 0;
int c = 0;
c = a & b; //按位與運算 0&0=0; 0&1=0; 1&0=0; 1&1=1; 兩位同時為“1”,結果才為“1”,否則為0
printf("a&b 的值是 %d \n",c ); //0
c = a | b; //按位或運算 0|0=0; 0|1=1; 1|0=1; 1|1=1; 只要有一個為1,其值為1。
printf("a|b 的值是 %d\n",c ); //1
c = a ^ b; //按位異或運算 0^0=0; 0^1=1; 1^0=1; 1^1=0; (異值)不同為1,相同為0
printf("a^b 的值是 %d\n",c ); //1
//取反 `
//int 2 或 4 字節 范圍 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
//計算機中的有符號數有三種表示方法,即原碼、反碼和補碼。符號位 用0表示“正”,用1表示“負”。在計算機系統中,數值一律用補碼來表示和存儲。 因為 使用補碼,可以將符號位和數值域統一處理(包括加法和減法)
//反碼通常是用來由原碼求補碼或者由補碼求原碼的過渡碼。正數的反碼與其原碼相同;負數的反碼是對正數逐位取反,符號位保持為1. 例如:原10010=反11101 ,原11101 = 反10010 即(-2十進制)
a =~a;
printf("~a 的值是 %d\n",a ); //-2
c = ~a; //取反 即0為1 , 1為0 假設1個字節即8bit位,則1的二進制值為(原碼):0000 0001 取反(補碼):1111 1110 將取反的值轉換成原碼(1000 0010 十進制 -2):
printf("~a 的值是 %d\n",c ); //1
c = ~b; //取反 即0為1 , 1為0 假設1個字節即8bit位,則0的二進制值為(原碼):0000 0000 取反(補碼):1111 1111 將取反的值轉換成原碼(1000 0001 十進制 -1):
printf("~b 的值是 %d\n",c ); //-1
c = ~2; //取反 2的二進制為 010 取反 101
printf("~2 的值是 %d\n",c ); //-3
c = ~3; //取反
printf("~3 的值是 %d\n",c ); //-4
c = ~4; //取反
printf("~4 的值是 %d\n",c ); //-5
c = ~5; //取反
printf("~5 的值是 %d\n",c ); //-6
/*
疑問1:1取反的值為什么是 -2 ?
1、假設:10的8位二進制
原碼:0000 1010
反碼:0000 1010 //正數的反碼與原碼相同
補碼:0000 1011 //反碼+1
2、假設:-10的8位二進制
原碼:1000 1010
反碼:1111 0101 //負數的反碼是對正數逐位取反,符號位保持為1
補碼:1111 0110 //反碼+1
3、假設:1的8位二進制
原碼:0000 0001
取反:1111 1110 //取反后的值,實際是“補碼”值
補碼還原反碼:1111 1101 //將補碼的值 還原成原碼:1、先還原成反碼,即先減1 ,
反碼還原原碼:1000 0010 //2、反碼再還原成原碼(負數的反碼是對正數逐位取反,符號位保持為1)
原碼轉換成10進制:-2
4、假設:0的8位二進制
原碼:0000 0000
取反:1111 1111
補碼還原反碼:1111 1110 //將補碼的值 還原成原碼:1、先還原成反碼,即先減1 ,
反碼還原原碼:1000 0001(-1 十進制)
5、假設:2的8位二進制
原碼:0000 0010
取反:1111 1101
補碼還原反碼:1111 1100 //減1
反碼還原原碼:1000 0011 (-3 十進制)
疑問2:為什么要用到取反? 取反有什么作用?
目前個人的理解,取反的作用,大部分用在 開關上,即開(1),關(0),僅此而已,無需深入研究。
*/
//左移 << 左移若干位,右不足補0
c = 1 << 2; //1左移2位
printf("c 的值是 %d\n",c ); //4 1的8位二進制原碼:0000 0001 左移2位:0000 0100(4 十進制)
c = 10 << 2; //10左移2位
printf("c 的值是 %d\n",c ); //40 10的8位二進制原碼:0000 1010 左移2位:0010 1000(40 十進制)
//右移 >> 右移若干位,左不足補0
c = 1 >> 2; //1右移2位
printf("c 的值是 %d\n",c ); //0 1的8位二進制原碼:0000 0001 右移2位:0000 0000(0 十進制)
c = 10 >> 2; //10右移2位
printf("c 的值是 %d\n",c ); //2 10的8位二進制原碼:0000 1010 右移2位:0000 0010(2 十進制)
}
創建時間:2021.11.01 更新時間: