2019年5月19日 星期日

Bit-wise Operation


Bit-wise Operation

  • Clear a bit
a &= (1 << n) // clear nth bit
unsigned char a = 65;
printf("%c\n", a);
int n = 0;
a &= ~(1 << n); // a = 64
printf("%c\n", a);
Output:
A
@
  • Set a bit
a |= (1 << n) // set nth bit
int main(){
    unsigned char b = 64;
    printf("%c \n", b);
    printf("%d \n", b);
    b |= (1 << 0);
    printf("%c \n", b);
    printf("%d \n", b);
}
Output:
@
64
A
65
  • Toggle a bit
a ^= (1 << n) // Toggle nth bit
int main(){
    unsigned char b = 5;
    printf("Origin : %d \n", b);    // 0101

    b ^= (1 << 0);
    printf("Toggle 0th : %d \n", b);// 0100

    b ^= (1 << 1);
    printf("Toggle 1th : %d \n", b);// 0110

    b ^= (1 << 2);
    printf("Toggle 2th : %d \n", b);// 0010

    b ^= (1 << 3);
    printf("Toggle 3th : %d \n", b);// 1010
}
Output:
Origin : 5
Toggle 0th : 4
Toggle 1th : 6
Toggle 2th : 2
Toggle 3th : 10
  • Two’s Complement
是一種用二進位表示有號數的方法,也是一種將數字的正負號變號的方式。
正數和0的二補數就是該數字本身。負數的二補數則是將其對應正數按位元取反再加1。
1 : 0001
-1: 1111
1 取反 -> 1110 -> 1110 + 1 -> 1111 -> -1
  • Sign bit
// if value is 2 bytes
bool sign = val & 0x8000
/*
      val : 0001 0000 0101 0011
(&) 0x8000: 1000 0000 0000 0000
we only care about the sign bit(left first).
*/
  • The right most byte(Least Significant byte / LSB)
// assuming val is 16 bit, 2-byte short integer
unsigned char lsb = val & 0xff
/*
     val: 0101 0101 "1010 1010"
(&) 0xff: 0000 0000  1111 1111
---------------------------------
          0000 0000  1010 1010
          Only get the last byte

*/
  • The left most byte(Most Significant byte / MSB)
// assuming val is 16 bit, 2-byte short integer
unsigned char msb = (val >> 8) & 0xff 
/*
      val: "0101 0101" 1010 1010

val >> 8: 0000 0000 0101 0101
(&) 0xff: 0000 0000 1111 1111
---------------------------------
          0000 0000 0101 0101
          only get the first byte
*/
  • Show Binary
int val = 85;
for (int i = 7; i >= 0; i--){
    int bit = (val >> i) & 1;
    printf("%d ", bit);
}
printf("\n");
Output:
0 1 0 1 0 1 0 1
  • Test a bit
int d = 5; // 0101
int n = 2; 
unsigned char e = d & (1 << n); // 0101 & (0100)
printf("%d\n", e);
Output:
4
  • Sample
#include <stdio.h>
#include <stdbool.h>
bool getBit(int n, int index) {
    return ((n & (1 << index)) > 0);
}

int setBit(int n, int index, bool b) {
    if (b)
        return (n | (1 << index));    
    int mask = ~(1 << index);
    return n & mask;
}

int main() {
    int num = 16, index;

    printf("Input\n");
    for (int i = 7; i >= 0; i--) 
        printf("%d ", getBit(num,i));
    printf("\n");

    /* set bit */
    index = 6;
    printf("Setting %d-th bit\n", index);
    num = setBit(num, index, true);
    for (int i = 7; i >= 0; i--) 
        printf("%d ", getBit(num,i));
    printf("\n");

    /* unset (clear) bit */
    index = 4;
    printf("Unsetting (Clearing) %d-th bit\n", index);
    num = setBit(num, index, false);
    for (int i = 7; i >= 0; i--) 
        printf("%d ", getBit(num,i));
    printf("\n");

    return 0;
}
Output:
Input
0 0 0 1 0 0 0 0
Setting 6-th bit
0 1 0 1 0 0 0 0
Unsetting (Clearing) 4-th bit
0 1 0 0 0 0 0 0
tags: Linux C

沒有留言:

張貼留言

Last Position of Target

Last Position of Target Lintcode : 458 / Leetcode : 34 Level : Easy Problem Find the last position of a target number in a sorted ...