# Binary Operation 隨手筆記 ###### tags: `linux2020` `C` `K&R` ## Hex to Binary coversion \begin{split} 0xFF &= 16*16^0 \\ &= 16(1*2^3+1*2^2+1*2^1+1*2^0)+16(0*2^3+0*2^2+0*2^1+0*2^0) \\ &= 2^4(1*2^3+1*2^2+1*2^1+1*2^0)+16 \\ &= (1*2^7 + 1*2^6 + 1*2^15 + 1*2^4) + (1*2^3 + 1*2^2 + 1*2^1 + 1*2^0) \\ &= 1*2^7 + 1*2^6 + 1*2^15 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0 \\ &= 0b11111111 \end{split} ## Setting and Clearning a bit. >Code: (with my comment and note) ```c=16 /* * created by unknowntpo at 2020.1.14(Tue) * @ ref: https://hackmd.io/@sysprog/By0MltO_m?type=view * @ title: Jserv linux核心 bitwise operation * Setting and Clearing a Bit. * */ #include <stdio.h> #include <stdbool.h> /* * @ Function: binary * @ convert the Decimal to Binary. * if n = 256 * n in binary is n = 0b100000000 * the initial i is i = 0b100000000 * --> when first loop end, the printed value is 1. */ void binary(unsigned int n) { for (int i=256; i>0; i/=2) { // i/=2 means right shift 1 bit if (n & i) printf(" 1"); else printf(" 0"); } printf("\n"); } /* * @ Function: getBit * @ get the current bit, which location is specified by the index. * * */ bool getBit(int n, int index){ return ((n & (1 << index)) >0); } /* * @ Function: setBit * @ set the current bit to 1. */ int setBit(int n, int index, bool b) { if(b) return (n | (1 << index)); // if b = true, just set the 'index'-th bit. int mask = ~(1 << index); return n & mask; // if b = false, the mask is used to unset the 'index'-th bit. } 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("# Clearing %d-th bit\n", index); num = setBit(num, index, false); // false means we want to clear the bit. for (int i = 7; i >= 0; i--) printf("%d ", getBit(num,i)); printf("\n"); } ``` >Output: ``` Input 0 0 0 1 0 0 0 0 Setting 6-th bit 0 1 0 1 0 0 0 0 Clearing 4-th bit 0 1 0 0 0 0 0 0 ``` Set the bit using [macro][1] :::info ## Example 2: Write a macro with two arguments a and pos, where a is a byte and the pos specifies a bit position of the byte. The macro should clear the particular bit position in the given byte. ```c=1 #include <stdio.h> /* bit clear: a: int, pos: bit position to clear */ #define CLEARBIT(a, pos) (a &= ~(1 << pos)) int main() { /* 'z': decimal value 122 (=01111010) */ char a = 'z'; /* clearing the 5th bit */ char aOut = CLEARBIT(a, 5); /* aOut = 'Z': decimal value 90 (=01011010) */ printf("aOut=%c\n", aOut); return 0; } ``` [1]:https://hackmd.io/@sysprog/By0MltO_m?type=view