C/C++/C#/JAVA 邏輯(位元)運算 應用
C/C++/C#/JAVA 邏輯(位元)運算 應用
資料來源: https://edisonx.pixnet.net/blog/post/34033421
線上執行: http://codepad.org/ / https://www.tutorialspoint.com/compile_c_online.php
01. 符號
(1.1) NOT (~):反相位元, 取補數
(1.2) AND (&):有0則0, a&0=0, a&1=1
(1.3) OR (|):有1則1, a|0 =a, a^1=1
(1.4) XOR (^):奇1則1, a^0=a, a^1=~a
(1.5) >> :向右移位, a >> n 即 a 向右移 n 個 bits
(1.6) << :向左移位, a << n 即 a 向左移 n 個 bits.
02. 乘以2的n次方
#include <stdio.h> int main() { int a, b; b=1; a = b*128; printf("a =%d\n",a); b=1; a = b << 7; // 128 = 2^7 printf("a =%d\n",a); return 0; }
03. 除以 2 的 n 次方
#include <stdio.h> int main() { int a, b; b=256; a = b / 128; printf("a =%d\n",a); b=256; a = b >> 7; // 128 = 2^7 printf("a =%d\n",a); return 0; }
04. 交換二整數(int, unsigned, char)數值
#include <stdio.h> int main() { int a=10, b=5; printf("a =%d,b=%d\n",a,b); a^=b; b^=a; a^=b; // 較不佳寫法:a^=b^=a^=b; printf("a =%d,b=%d\n",a,b); return 0; }
05. 判斷是否為奇數 (mask)
#include <stdio.h> int main() { int a=10,b=-1; if(a%2==0) // return 1, 奇數 { b=1; } else // return 0, 偶數 { b=0; } printf("b=%d\n",b); a=10; if((a&(0x01))==0) // return 1, 奇數 { b=1; } else // return 0, 偶數 { b=0; } printf("b=%d\n",b); }
06. 整數(int) 取負數(變號)
#include <stdio.h> int main() { int a, b; a=10; b = -a; printf("b=%d\n",b); a=10; b = ~a+1; printf("b=%d\n",b); a=10; b = (a ^ -1) + 1; printf("b=%d\n",b); }
07. 取2的n次方餘數
#include <stdio.h> int main() { int a, b, c; b=157; c=8; a = b % c; // c = 2^n printf("a=%d\n",a); a = b & (c-1); printf("a=%d\n",a); }
08. 判斷是否為2的n次方
#include <stdio.h> int main() { int a=128,b=-1; if( (a & -a) == a) // return 1, 為2之n方 { b=1; } else // return 0, 非2之n方 { b=0; } printf("b=%d\n",b); }
09. 遞增運算子與遞減運算子
#include <stdio.h> int main() { int a; a=10; a = -~a; //a++; printf("a=%d\n",a); a = ~-a; // a--; printf("a=%d\n",a); }
10. 取低4bits位元(mask)
#include <stdio.h> int main() { unsigned a, b; a=255; b = a & 0x0f; // a取低4bits給b printf("b=%d\n",b); }
11. 取高4bits位元(mask)
#include <stdio.h> int main() { unsigned a, b; a=255-128; b = a&(0xf0); // a 取高4bits 給b printf("b=%d\n",b); b=b>>4; printf("b=%d\n",b); }
12. 取絕對值
#include <stdio.h> int main() { int a, b; // assume int has 4 bytes. a=0; b=-10; a = b<0 ? -b : b; printf("a=%d\n",a); b=-100; a = (b ^ (b>>31)) - (b >> 31); printf("a=%d\n",a); }
13. 比較是否同號
#include <stdio.h> int main() { int a, b, equ; a=10; b=20; equ=-1; if((a*b) > 0) { equ = 1; } else { equ = 0; } printf("equ = %d\n",equ); if((a^b) > 0) { equ = 1; } else { equ = 0; } printf("equ = %d\n",equ); }
心得:
基本四則運算都可以用邏輯電路實現
One thought on “C/C++/C#/JAVA 邏輯(位元)運算 應用”
程式設計師 最高等級 靠數學
簡單(基礎)的數學&邏輯電路 概念 也可以有高效率程式