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
沒有留言:
張貼留言