Bitwise Operation

Tags: C, Bitwise
References: 1,

Functions

SHIFT LEFT <<, SHIFT RIGHT >>

้€™ๅ…ฉๅ€‹้‹็ฎ—ๅญ็š„ๅŠŸ่ƒฝไธป่ฆๆ˜ฏ็งปๅ‹•ไธ€ๅ€‹่ฎŠๆ•ธไธญ็š„ๆ‰€ๆœ‰ไฝๅ…ƒ๏ผŒไฝๅ…ƒๅ‘ๅทฆ / ๅ‘ๅณ็งปๅ‹•ไน‹ๅพŒ๏ผŒๆœ€้ซ˜ไฝ / ๆœ€ไฝŽไฝ็š„ไฝๅ…ƒๆœƒๆถˆๅคฑ๏ผŒๆœ€ไฝŽไฝ / ๆœ€้ซ˜ไฝ็š„ไฝๅ…ƒ่ฃœ 0

5 << 1 = 10  <==>  00100 << 1 = 01010

5 << 2 = 20  <==>  00101 << 2 = 10100

5 >> 1 = 2   <==>  00101 >> 1 = 00010

5 >> 2 = 1   <==>  00101 >> 2 = 00001

็•ถๅ…จ้ƒจไฝๅ…ƒๅ‘ๅทฆ็งปๅ‹•ไธ€ไฝๆ™‚๏ผŒๆœƒ่ฎŠๆˆๅŽŸไพ†็š„ๅ…ฉๅ€๏ผŒๅ‘ๅทฆ็งปๅ‹•ไธ€ไฝๆ™‚๏ผŒๆœƒ่ฎŠๆˆๅŽŸไพ†็š„1/2ๅ€ใ€‚


AND &

& ็š„ๅŠŸ่ƒฝๆ˜ฏๅฐ‡ๅ…ฉๅ€‹่ฎŠๆ•ธๅฐๆ‡‰็š„ไฝๅ…ƒ้€ฒ่กŒ AND ้‚่ผฏ้‹็ฎ—๏ผŒ็„ถๅพŒ็”ข็”Ÿๆ–ฐ่ฎŠๆ•ธใ€‚็”จไพ†ๅˆคๅˆฅไฝๅ…ƒๆ˜ฏไธๆ˜ฏไธ€ไนŸๅพˆๆ–นไพฟใ€‚

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

ๆธฌ่ฉฆๆœ‰ๅคšๅฐ‘ไฝๅ…ƒ็š„ๅ€ผ๏ผ1๏ผš

#include <stdio.h>

int main(){
    int num = ***;
    int digit = sizeof(num) * 8; // ๅพ…ๆธฌๆ•ธ็‚บๅนพไฝๅ…ƒ
    int count = 0;
    
    //for(int i=1; i<=num; i=i*2){if(num & i) count++;}
    
    for(int i = digit-1; i >= 0; i --) //็•ฅๅŽป้ซ˜ไฝ0.
        if(num &(1<<i)) count++;
    printf("%d\n", count);
    return 0;
}
int mark_9th_bit(int n) // ๆจ™็คบ็ฌฌไนไฝๅ…ƒ็š„ๅ€ผ
{  
    return n & (1 << 8);  
}

OR |

| ็š„ๅŠŸ่ƒฝๆ˜ฏๅฐ‡ๅ…ฉๅ€‹่ฎŠๆ•ธๅฐๆ‡‰็š„ไฝๅ…ƒ้€ฒ่กŒ OR ้‚่ผฏ้‹็ฎ—ใ€‚

ไพ‹ๅฆ‚๏ผš

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

XOR ^

^ ็š„ๅŠŸ่ƒฝๆ˜ฏๅฐ‡ๅ…ฉๅ€‹่ฎŠๆ•ธๅฐๆ‡‰็š„ไฝๅ…ƒ้€ฒ่กŒ XOR ้‚่ผฏ้‹็ฎ—ใ€‚ๅฏไปฅ็”จไพ†ๅ่ฝ‰ๆŸไฝๅ…ƒ็š„ๅ€ผ๏ผŒไนŸๅฏไปฅ็”จไพ†ๅš็ฐกๅ–ฎๅŠ ๅฏ†ใ€‚

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

ๅ่ฝ‰ๆŸไฝๅ…ƒ

int reverse_9th_bit(int n) // ๅ่ฝ‰็ฌฌไนไฝๅ…ƒ็š„ๅ€ผ
{  
    return n ^ (1 << 8);  
}

ไธไฝฟ็”จๆšซๅญ˜่ฎŠๆ•ธ๏ผˆtemporary variable๏ผ‰ไบคๆ›ๅ…ฉๅ€‹็›ธ็•ฐ่ฎŠๆ•ธ

// a should not equal to b
a = a ^ b
b = a ^ b
a = a ^ b

ๅŠ ๅฏ†

#include <stdio.h>

int main(void) {
    char ch = 'D';

    printf("before encoding๏ผš%c\n", ch);

    ch = ch ^ 0xC;
    printf("after encoding๏ผš%c\n", ch);

    ch = ch ^ 0xC;
    printf("decoding๏ผš%c\n", ch);

    return 0;
}

OUTPUT

before encoding๏ผšD
after encoding๏ผšH
decoding๏ผšD

NOT ~

~ ็š„ๅŠŸ่ƒฝๆ˜ฏ้ก›ๅ€’ไธ€ๅ€‹่ฎŠๆ•ธๆฏไธ€ๅ€‹ไฝๅ…ƒ็š„ 0 ๅ’Œ 1ใ€‚

~0 = 1
~1 = 0
~00101101 = 11010010 

Applications

  • ๆ•ดๆ•ธ่ฎŠ่™Ÿ

    โ€‹โ€‹โ€‹โ€‹int negative(int x)  
    โ€‹โ€‹โ€‹โ€‹{  
    โ€‹โ€‹โ€‹โ€‹    return ~x + 1;  // -x;  
    โ€‹โ€‹โ€‹โ€‹} 
    
    • NOT ๅพŒ +1 -> ไบŒ่ฃœๆ•ธ -> ๆญฃ่ฒ ่ฎŠ่™Ÿ
  • ๅˆคๆ–ทๅฅ‡ๅถ

    โ€‹โ€‹โ€‹โ€‹bool is_odd(int x)  
    โ€‹โ€‹โ€‹โ€‹{  
    โ€‹โ€‹โ€‹โ€‹    return x & 1;   // x % 2;  
    โ€‹โ€‹โ€‹โ€‹}  
    
    • ่ง€ๅฏŸๆœ€ไฝŽไฝๅ…ƒๆ˜ฏๅฆ็‚บ 1
      • TRUE๏ผŒๅฅ‡ๆ•ธ
      • FALSE๏ผŒๅถๆ•ธ
  • ๆ•ดๆ•ธๅ–็ต•ๅฐๅ€ผ

    โ€‹โ€‹โ€‹โ€‹int abs(int x)  
    โ€‹โ€‹โ€‹โ€‹{  
    โ€‹โ€‹โ€‹โ€‹    // x < 0 ? -x : x;  
    โ€‹โ€‹โ€‹โ€‹    // x >> 31 = 111...111 (ๅฆ‚ๆžœxๆ˜ฏ่ฒ ๆ•ธ) or 000...000 (ๅฆ‚ๆžœxๆ˜ฏๆญฃๆ•ธ)  
    โ€‹โ€‹โ€‹โ€‹    // x ^ (x>>31)  => ๅฆ‚ๆžœ x ็‚บ่ฒ ๆ•ธๅ‰‡ๅฐ‡ x ็š„ 0่ฝ‰1, 1่ฝ‰0, ๅฆ‚ๆžœ x ็‚บๆญฃๆ•ธ, ๅ‰‡ไฟๆŒx ไธ่ฎŠ.  
    โ€‹โ€‹โ€‹โ€‹    // (x ^ (x >> 31)) - (x >> 31) => ๅฆ‚ๆžœ x ็‚บๆญฃๆ•ธๅ‰‡ x-0=x , ๅฆ‚ๆžœ x ็‚บ่ฒ ๆ•ธๅ‰‡ ~x-(-1) = -x    
    โ€‹โ€‹โ€‹โ€‹    return (x ^ (x >> 31)) - (x >> 31);  
    โ€‹โ€‹โ€‹โ€‹}
    
    โ€‹โ€‹โ€‹โ€‹#include <stdio.h>
    
    โ€‹โ€‹โ€‹โ€‹long int labs(long int x)  
    โ€‹โ€‹โ€‹โ€‹{  
    โ€‹โ€‹โ€‹โ€‹    int n = sizeof(x)*8 - 1; // how many digit - 1
    โ€‹โ€‹โ€‹โ€‹    return (x ^ (x >> n)) - (x >> n);  
    โ€‹โ€‹โ€‹โ€‹}
    
    โ€‹โ€‹โ€‹โ€‹int main(){
    โ€‹โ€‹โ€‹โ€‹    long int num = -1556543547665469;
    โ€‹โ€‹โ€‹โ€‹    printf("%ld\n", labs(num));
    โ€‹โ€‹โ€‹โ€‹    return 0;
    โ€‹โ€‹โ€‹โ€‹}
    
  • ๆœ€ไฝŽไฝๅ…ƒ1

    โ€‹โ€‹โ€‹โ€‹#include <stdio.h>
    
    โ€‹โ€‹โ€‹โ€‹int lowest_bit_1(int x)
    โ€‹โ€‹โ€‹โ€‹{  
    โ€‹โ€‹โ€‹โ€‹    print_bin(x);
    โ€‹โ€‹โ€‹โ€‹    printf("\n");
    โ€‹โ€‹โ€‹โ€‹    print_bin(-x);
    โ€‹โ€‹โ€‹โ€‹    printf("\n");
    โ€‹โ€‹โ€‹โ€‹    return x & -x;  
    โ€‹โ€‹โ€‹โ€‹}  
    
    โ€‹โ€‹โ€‹โ€‹int main(){
    โ€‹โ€‹โ€‹โ€‹    int num = 1638;
    โ€‹โ€‹โ€‹โ€‹    printf("%d\n", lowest_bit_1(num));
    โ€‹โ€‹โ€‹โ€‹}
    

    ๅŽŸ็†:

    โ€‹โ€‹โ€‹โ€‹          number: 0000001101111000
    โ€‹โ€‹โ€‹โ€‹      complement: 1111110010000111
    

    Then we add 1 to it.

    โ€‹โ€‹โ€‹โ€‹          number: 0000001101111000
    โ€‹โ€‹โ€‹โ€‹      complement: 1111110010000111
    โ€‹โ€‹โ€‹โ€‹           add 1: 1111110010001000
    

    Note that if the rightmost bit is 1, this would create a carry which flips all 1s into 0s until a 0 is reached.

    This number is now actually also the binary representation of -number.

    โ€‹โ€‹โ€‹โ€‹          number: 0000001101111000
    โ€‹โ€‹โ€‹โ€‹      complement: 1111110010000111
    โ€‹โ€‹โ€‹โ€‹           add 1: 1111110010001000
    โ€‹โ€‹โ€‹โ€‹         -number: 1111110010001000
    

    We now take the bitwise & of number and -number.

    โ€‹โ€‹โ€‹โ€‹          number: 0000001101111000
    โ€‹โ€‹โ€‹โ€‹         -number: 1111110010001000
    โ€‹โ€‹โ€‹โ€‹number & -number: 0000000000001000
    
  • ๆœ€้ซ˜ไฝๅ…ƒ1

    โ€‹โ€‹โ€‹โ€‹//O(log n)
    โ€‹โ€‹โ€‹โ€‹unsigned int hibit(unsigned int n) {
    โ€‹โ€‹โ€‹โ€‹    n |= (n >>  1);
    โ€‹โ€‹โ€‹โ€‹    n |= (n >>  2);
    โ€‹โ€‹โ€‹โ€‹    n |= (n >>  4);
    โ€‹โ€‹โ€‹โ€‹    n |= (n >>  8);
    โ€‹โ€‹โ€‹โ€‹    n |= (n >> 16);
    โ€‹โ€‹โ€‹โ€‹    return n - (n >> 1);
    โ€‹โ€‹โ€‹โ€‹}
    โ€‹โ€‹โ€‹โ€‹int main(){
    โ€‹โ€‹โ€‹โ€‹    int a = 145;
    โ€‹โ€‹โ€‹โ€‹    printf("%d\n", test(a));
    โ€‹โ€‹โ€‹โ€‹}
    
    โ€‹โ€‹โ€‹โ€‹unsigned int hibit(unsigned int x)
    โ€‹โ€‹โ€‹โ€‹{
    โ€‹โ€‹โ€‹โ€‹  unsigned int n;
    โ€‹โ€‹โ€‹โ€‹  while ( (x & (x - 1)) != 0 )  {
    โ€‹โ€‹โ€‹โ€‹      x &= (x-1);
    โ€‹โ€‹โ€‹โ€‹  }
    โ€‹โ€‹โ€‹โ€‹  return x;
    โ€‹โ€‹โ€‹โ€‹}
    
  • ๅˆคๆ–ทๆ˜ฏไธๆ˜ฏ 2 ็š„ๆฌกๆ–น

    โ€‹โ€‹โ€‹โ€‹bool is_power_of_2(int x)  {  
    โ€‹โ€‹โ€‹โ€‹    return (x & -x) == x;
    โ€‹โ€‹โ€‹โ€‹}  
    

    ๅŽŸ็†:

    • ๅ› ็‚บๅฆ‚ๆžœๆ˜ฏไบŒ็š„ๆฌกๆ–น๏ผŒๅ‰‡ๅพžไบŒ้€ฒๅˆถ่ง€ๅฏŸๆ™‚๏ผŒๅชๆœƒๆœ‰ไธ€ๅ€‹ set bit (e.g. 0010 0000)ใ€‚
      ๆ‰€ไปฅ (x & -x) ๅพ—ๅˆฐ็š„ๆœ€ไฝŽไฝ set bit๏ผŒ่‹ฅๅˆ็ญ‰ๆ–ผ x ๆœฌ่บซ๏ผŒๅ‰‡่กจ็คบ x ๅชๆœ‰ไธ€ๅ€‹ set bit๏ผŒไนŸๅฐฑๆ˜ฏ x ็‚บไบŒ็š„ๆฌกๆ–นๆ•ธใ€‚
  • ไบคๆ›ๅ…ฉๅ€‹ int ่ฎŠๆ•ธ

    โ€‹โ€‹โ€‹โ€‹void swap(int& x, int& y)  
    โ€‹โ€‹โ€‹โ€‹{  
    โ€‹โ€‹โ€‹โ€‹    x = x ^ y;   // x' = x  ^ y  
    โ€‹โ€‹โ€‹โ€‹    y = x ^ y;   // y' = x' ^ y  = x ^ y ^ y = x  
    โ€‹โ€‹โ€‹โ€‹    x = x ^ y;   // x  = x' ^ y' = x ^ y ^ x = y  
    โ€‹โ€‹โ€‹โ€‹}  
    
  • ่จˆ็ฎ—ๆœ‰ๅนพๅ€‹ไฝๅ…ƒๆ˜ฏ1

    โ€‹โ€‹โ€‹โ€‹int count_bits2(unsigned int n) {  
    โ€‹โ€‹โ€‹โ€‹int i=0;  
    โ€‹โ€‹โ€‹โ€‹for (; n != 0; n>>=1) 
    โ€‹โ€‹โ€‹โ€‹    if (n & 1)
    โ€‹โ€‹โ€‹โ€‹        ++i;  
    โ€‹โ€‹โ€‹โ€‹return i;  
    โ€‹โ€‹โ€‹โ€‹}  
    

    ๅŽŸ็†:

    • ไธ€็›ดๅฐ‡่ฎŠๆ•ธ right shift 1 ไธฆ AND 1๏ผŒ่‹ฅ็‚บ TRUE ๏ผŒๅ‰‡ ++countใ€‚

    โ€“

    โ€‹โ€‹โ€‹โ€‹unsigned char Cal_bit1_Num(int sample)
    โ€‹โ€‹โ€‹โ€‹{
    โ€‹โ€‹โ€‹โ€‹    unsigned char Num = 0;
    
    โ€‹โ€‹โ€‹โ€‹    while (sample)
    โ€‹โ€‹โ€‹โ€‹    {
    โ€‹โ€‹โ€‹โ€‹        Num++;
    โ€‹โ€‹โ€‹โ€‹        sample = (sample - 1) & sample;
    โ€‹โ€‹โ€‹โ€‹    }
    
    โ€‹โ€‹โ€‹โ€‹    return Num;
    โ€‹โ€‹โ€‹โ€‹}
    
  • ้ก›ๅ€’ไฝๅ…ƒ้ †ๅบ

    • Common Solution:

      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹int reverse_bits(int x)  
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹{  
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹    x = ((x >> 1) & 0x55555555) | ((x << 1) & 0xaaaaaaaa);  
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹    x = ((x >> 2) & 0x33333333) | ((x << 2) & 0xcccccccc);  
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹    x = ((x >> 4) & 0x0f0f0f0f) | ((x << 4) & 0xf0f0f0f0);  
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹    x = ((x >> 8) & 0x00ff00ff) | ((x << 8) & 0xff00ff00);  
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹    x = ((x >> 16) & 0x0000ffff) | ((x << 16) & 0xffff0000);  
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹    return x;  
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹}  
      

      ่งฃ้‡‹

      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹x = 0101 1011 0001
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹0x55555555 -> 0101 0101 0101 0101 0101 0101 0101 0101
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹0xaaaaaaaa -> 1010 1010 1010 1010 1010 1010 1010 1010
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹(x >> 1) & 0x55555555) | ((x << 1) & 0xaaaaaaaa)
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹= 0010 1101 1000 & 0101 0101 0101 | 1011 0110 0010 & 1010 1010 1010
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹= 0000 0101 0000 | 1010 0010 0010
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹= 1010 0111 0010
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹0x33333333 -> 0011 0011 0011 0011 0011 0011 0011 0011
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹0xcccccccc -> 1100 1100 1100 1100 1100 1100 1100 1100
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹0x0f0f0f0f -> 0000 1111 0000 1111 0000 1111 0000 1111
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹0xf0f0f0f0 -> 1111 0000 1111 0000 1111 0000 1111 0000
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹0x00ff00ff -> 0000 0000 1111 1111 0000 0000 1111 1111
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹0xff00ff00 -> 1111 1111 0000 0000 1111 1111 0000 0000
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹0x0000ffff -> 0000 0000 0000 0000 1111 1111 1111 1111
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹0xffff0000 -> 1111 1111 1111 1111 0000 0000 0000 0000
      
    • Use uint32_t:
      ้—œๆ–ผ uint32_t ๅฎš็พฉๅฏไปฅๆŸฅ็œ‹ไปฅไธ‹

      <stdint.h>
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹/* Exact integral types.  */
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹/* Signed.  */
      
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹/* There is some amount of overlap with <sys/types.h> as known by inet code */
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#ifndef __int8_t_defined
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹# define __int8_t_defined
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef signed char              int8_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef short int                int16_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef int                      int32_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹# if __WORDSIZE == 64
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef long int                 int64_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹# else
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹__extension__
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef long long int            int64_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹# endif
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#endif
      
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹/* Unsigned.  */
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned char            uint8_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned short int       uint16_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#ifndef __uint32_t_defined
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned int             uint32_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹# define __uint32_t_defined
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#endif
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#if __WORDSIZE == 64
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned long int        uint64_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#else
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹__extension__
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned long long int   uint64_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#endif
      
      
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹/* Small types.  */
      
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹/* Signed.  */
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef signed char              int_least8_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef short int                int_least16_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef int                      int_least32_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#if __WORDSIZE == 64
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef long int                 int_least64_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#else
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹__extension__
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef long long int            int_least64_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#endif
      
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹/* Unsigned.  */
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned char            uint_least8_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned short int       uint_least16_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned int             uint_least32_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#if __WORDSIZE == 64
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned long int        uint_least64_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#else
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹__extension__
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned long long int   uint_least64_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#endif
      
      
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹/* Fast types.  */
      
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹/* Signed.  */
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef signed char              int_fast8_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#if __WORDSIZE == 64
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef long int                 int_fast16_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef long int                 int_fast32_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef long int                 int_fast64_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#else
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef int                      int_fast16_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef int                      int_fast32_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹__extension__
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef long long int            int_fast64_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#endif
      
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹/* Unsigned.  */
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned char            uint_fast8_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#if __WORDSIZE == 64
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned long int        uint_fast16_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned long int        uint_fast32_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned long int        uint_fast64_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#else
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned int             uint_fast16_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned int             uint_fast32_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹__extension__
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned long long int   uint_fast64_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#endif
      
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹/* Types for `void *' pointers.  */
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#if __WORDSIZE == 64
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹# ifndef __intptr_t_defined
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef long int                 intptr_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#  define __intptr_t_defined
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹# endif
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned long int        uintptr_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#else
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹# ifndef __intptr_t_defined
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef int                      intptr_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#  define __intptr_t_defined
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹# endif
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned int             uintptr_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#endif
      
      
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹/* Largest integral types.  */
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#if __WORDSIZE == 64
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef long int                 intmax_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned long int        uintmax_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#else
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹__extension__
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef long long int            intmax_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹__extension__
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹typedef unsigned long long int   uintmax_t;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹#endif
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹.
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹.
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹.
      

      https://sites.uclouvain.be/SystInfo/usr/include/stdint.h.html

      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹uint32_t reverseBits(uint32_t n){
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹    uint32_t m = 0;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹    for(int i=0; i<32; i++, n>>=1){
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹        m <<= 1;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹        m |= n&1;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹    }
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹    return m;
      โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹}
      
  • ๆ”นๆŸๅ€‹bit็‚บ1ๆˆ–0

    โ€‹โ€‹โ€‹โ€‹void bit_ctrl_0 (char* pflag, int bit) {
    โ€‹โ€‹โ€‹โ€‹    *pflag &= ~(1 << bit); //ๆ”น0 -> ๅ…ˆ็”จmask๏ผŒๅ†็”จand
    โ€‹โ€‹โ€‹โ€‹}
    
    โ€‹โ€‹โ€‹โ€‹void bit_ctrl_1 (char* pflag, int bit) {
    โ€‹โ€‹โ€‹โ€‹    *pflag |= (1 << bit); //ๆ”น1 -> ็›ดๆŽฅor
    โ€‹โ€‹โ€‹โ€‹}