!和~的區別(邏輯取反和按位取反)
在c語言中,!和~均表示取反,這兩個的區別在於:
- ! :代表邏輯取反,即:把非0的數值變為0,0變為1;
- ~ :表示按位取反,即在數值的二進位制表示方式上,將0變為1,將1變為0;
- 上述其實可以從java中進行借鑑理解,java中!代表邏輯取反,針對的是boolean型值計算;而~代表數值取反,針對整型值進行計算;
通過如下例子來驗證上述結論:
reverse_not.c
#include<stdio.h>
int main(){
int a,b,c;
a = !0;//邏輯運算,0數值轉化為1
b = !10;//邏輯運算,非0數值轉化為0
// 按位取反,10的16進製表示為0x00 00 00 0a,取反後為轉化為0xff ff ff f5(這個是補碼)
// 從補碼往回計算出原碼,得出真值,最高位為1表示為負值,負號後的值為:
// 0x1 00 00 00 00 - 0xff ff ff f5 = 11,得到-11
c = ~10;
printf("%d,%d,%d\n",a,b,c);//運算結果為1,0,-11
}
reverse_not.java
public class reverse_not{
public static void main(String[] args) {
// 這裡程式碼報錯,一元運算子,'!' 的運算元型別int錯誤,可見在java中,
// 規定了!運算子操作
// System.out.println(!10);
// 這裡的運算結果和c語言中一致,也是-11,可見在java中也是使用補碼,
// 並沒有針對做真值取反的所謂優化
System.out.println(~10);
}
}
相關文章
- Java中按位取反運算子Java
- C# ~按位取反運算子C#
- 位操作(取反)
- 位運算子之---按位取反運算子(簡單易懂)
- 二進位制取反
- 對十進位制數字的按位輸出,取反,並求其位數
- Java 16進位制字串 取反Java字串
- LeetCode1005. K 次取反後最大化的陣列和LeetCode陣列
- 取反(分塊+二分)
- php 和 j s 對數字,字母,漢子等特殊字串 取反PHP字串
- C++取反交換兩個數的值C++
- Cookie和Session的區別,Koa2+Mysql+Redis實現登入邏輯CookieSessionMySqlRedis
- 演算法與邏輯的區別演算法
- 二進位制中為什麼負數是正數取反再加一
- 學懂模運算 負數的補碼為什麼要按位取反再加一
- 淺析Win10系統主分割槽和邏輯分割槽的區別Win10
- select * 和 select 所有欄位的區別
- 電位器和編碼器的區別
- 【C++】【OpenCV-4.9.0】灰度圖取反(Mat屬性的使用)C++OpenCV
- python32位和64位的區別是什麼Python
- ../和./和/的區別
- 簡單介紹如何通過註解獲取反射的值反射
- SAPCRMOneorder裡userstatus和systemstatus的mapping邏輯APP
- 業務邏輯漏洞和cs
- C語言基礎-1、邏輯型別和運算C語言型別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- ||和??的區別
- /*和/**的區別
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- 業務分析:HR端職位編輯薪資計算邏輯和錯誤分析
- 物聯網學習教程——邏輯運算子和邏輯表示式
- Flutter 的渲染邏輯及和 Native 通訊Flutter
- 短影片的底層邏輯和認知
- 關於 isset 和邏輯運算子的使用
- 理解Nginx中Server和Location的匹配邏輯NginxServer
- Linux下的磁碟分割槽和邏輯卷Linux
- SAP Fiori裡Contact Support的按鈕渲染邏輯
- linux系統掛載邏輯卷和擴充套件邏輯卷組Linux套件