一、基本概念
按位取反是一種操作,用於改變二進制數每一位的值,使0變成1,1變成0。
在C語言中,按位取反使用 ~ 符號進行表示。
int a = 10; //a的二進制表示為 0000 1010 int b = ~a; //按位取反後,b的二進制表示為 1111 0101
二、按位取反的應用
1. 二進制運算
按位取反可以用於邏輯運算中的「非」操作。
int a = 10; //a的二進制表示為 0000 1010 int b = ~a; //按位取反後,b的二進制表示為 1111 0101 /* * 在邏輯運算中,0表示false,1表示true * 所以,a = 10表示true,~a = -11也表示true * a的二進制表示為 0000 1010,b的二進制表示為 1111 0101 * 因為-11和-1、-10等是true,所以b的值為true */ if (~a) { printf("true"); } else { printf("false"); }
2. 原地交換數據
按位取反還可以用於原地交換兩個數的值。
int a = 10; //a的二進制表示為 0000 1010 int b = 20; //b的二進制表示為 0001 0100 a = a ^ b; //a的二進制表示為 0001 1110 b = a ^ b; //b的二進制表示為 0000 1010,即10 a = a ^ b; //a的二進制表示為 0001 0100,即20
三、按位取反注意事項
1. 數據類型限制
按位取反只能作用於整型數據。
float a = 10.0; float b = ~a; //錯誤,浮點型數據無法使用按位取反操作
2. 運算符優先級
按位取反的運算符優先級比較低,所以需要注意使用括號進行運算控制。
int a = 10; int b = ~a + 1; //錯誤,~a的優先級比+低,需要使用括號改變優先級 int c = (~a) + 1;
3. 正負號問題
在按位取反一般情況下,會將數據的符號改變。對於整數來說,取反後最高位的值為1(負數的符號位);對於負數來說,取反後最高位的值變為0(正數的符號位)。
int a = 10; //a的二進制表示為 0000 1010 int b = ~a; //按位取反後,b的二進制表示為 1111 0101,即-11 int c = ~b; //再次取反後,c的二進制表示為 0000 1010,即10
四、示例代碼
#include int main() { int a = 10; int b = ~a; printf("a = %d\n", a); printf("~a = %d\n", b); if (~a) { printf("true\n"); } else { printf("false\n"); } int c = 20; printf("swap before: a=%d b=%d\n", a, c); a = a ^ c; c = a ^ c; a = a ^ c; printf("swap after: a=%d b=%d\n", a, c); return 0; }
原創文章,作者:XJBKI,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/373050.html