C/C++/C#/JAVA 邏輯(位元)運算 應用

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 邏輯(位元)運算 應用

  1. 程式設計師 最高等級 靠數學
    簡單(基礎)的數學&邏輯電路 概念 也可以有高效率程式

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *