61 lines
1.6 KiB
Plaintext
61 lines
1.6 KiB
Plaintext
|
|
// Public domain / CC0. Use freely for any purpose. RoyR 2026
|
||
|
|
// bitwise.cm - Bitwise operations
|
||
|
|
// Demonstrates: bitwise operators, bit manipulation, shifts
|
||
|
|
|
||
|
|
void printf(uint8 *fmt);
|
||
|
|
|
||
|
|
void print_binary(uint32 n) {
|
||
|
|
printf("0b");
|
||
|
|
for (int32 i = 31; i >= 0; i = i - 1) {
|
||
|
|
printf("%d", (n >> i) & 1);
|
||
|
|
if (i % 4 == 0 && i != 0) printf("_");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 count_set_bits(uint32 n) {
|
||
|
|
int32 count = 0;
|
||
|
|
while (n) {
|
||
|
|
count = count + (n & 1);
|
||
|
|
n = n >> 1;
|
||
|
|
}
|
||
|
|
return count;
|
||
|
|
}
|
||
|
|
|
||
|
|
uint32 reverse_bits(uint32 n) {
|
||
|
|
uint32 result = 0;
|
||
|
|
for (int32 i = 0; i < 32; i = i + 1) {
|
||
|
|
result = result << 1;
|
||
|
|
result = result | (n & 1);
|
||
|
|
n = n >> 1;
|
||
|
|
}
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 is_power_of_two(uint32 n) {
|
||
|
|
return n && ((n & (n - 1)) == 0);
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 main(void) {
|
||
|
|
uint32 a = 0xAB;
|
||
|
|
uint32 b = 0x55;
|
||
|
|
|
||
|
|
printf("a = %d = ", a); print_binary(a); printf("\n");
|
||
|
|
printf("b = %d = ", b); print_binary(b); printf("\n");
|
||
|
|
|
||
|
|
printf("\nBitwise AND: %d = ", a & b); print_binary(a & b); printf("\n");
|
||
|
|
printf("Bitwise OR: %d = ", a | b); print_binary(a | b); printf("\n");
|
||
|
|
printf("Bitwise XOR: %d = ", a ^ b); print_binary(a ^ b); printf("\n");
|
||
|
|
printf("Bitwise NOT: %d = ", ~a); print_binary(~a); printf("\n");
|
||
|
|
|
||
|
|
printf("\nLeft shift (a << 2): %d\n", a << 2);
|
||
|
|
printf("Right shift (a >> 2): %d\n", a >> 2);
|
||
|
|
|
||
|
|
printf("\nSet bits in a: %d\n", count_set_bits(a));
|
||
|
|
printf("Set bits in b: %d\n", count_set_bits(b));
|
||
|
|
|
||
|
|
printf("\nIs 64 power of two? %d\n", is_power_of_two(64));
|
||
|
|
printf("Is 63 power of two? %d\n", is_power_of_two(63));
|
||
|
|
|
||
|
|
return 0;
|
||
|
|
}
|