This daily will allow you to practice more with the bit wise operators and shift
ID: 3889898 • Letter: T
Question
This daily will allow you to practice more with the bit wise operators and shifts. Consider the following modification of the main program from daily 4:
void set_flag(unsigned int flag_holder[], int flag_position);
void unset_flag(unsigned int flag_holder[], int flag_position);
int check_flag(unsigned int flag_holder[], int flag_position);
void display_32_flags_as_array(unsigned int flag_holder);
void display_flags(unsigned int flag_holder[], int size);
int main(int argc, char* argv[])
{
unsigned int flag_holder[5] = { 0 };//Set the first integer to zero and all others to zero by default.
set_flag(flag_holder, 3);
set_flag(flag_holder, 16);
set_flag(flag_holder, 31);
set_flag(flag_holder, 87);
display_flags(flag_holder, 5);
printf(" ");
unset_flag(flag_holder, 31);
unset_flag(flag_holder, 3);
set_flag(flag_holder, 99);
set_flag(flag_holder, 100);
display_flags(flag_holder, 5);
return 0; }
Here I have changed the functions so that they take an array of integers instead of just one integer. This allows me to imagine that I have a long array of bits instead of an array of integers. The functions can now set, unset, check and display flags for any bit in the array of 5 integers that I have made (and should work for any size array as long as your bit index is in bounds of your array).
I also changed the display behavior. Daily 4 displayed the flags as you would see them in a binary number but since this program is moving away from the idea of a binary number to store bits and moving toward the idea of having an array of bits the display_32_flags_as_array function will display the [0] bit first then [1] and so on up to 31 whereas the display_32_flags function in daily 4 displays the [31] bit first and down to [0]. Similarly the display_flags function now takes an array of integers and displays one integer per line using the display_32_flags_as_array function. Your output should look exactly like the following:
You may want to be careful about how you call your check_flag function from inside the display_32_flags_as_array function since that function receives an integer and check_flag is expecting an array. How can you overcome this obstacle?
// could someone please help me solve this and include comments so I can further understand this? Thank you!
Explanation / Answer
#include<stdio.h>
void set_flag(unsigned int* flag_holder, int flag_position);
void unset_flag(unsigned int * flag_holder, int flag_position);
int check_flag(unsigned int flag_holder, int flag_position);
void display_32_flags(unsigned int flag_holder);
int main(int argc, char* argv[])
{
unsigned int flag_holder = 0;
set_flag(&flag_holder, 3);
set_flag(&flag_holder, 16);
set_flag(&flag_holder, 31);
display_32_flags(flag_holder);
unset_flag(&flag_holder, 31);
unset_flag(&flag_holder, 3);
set_flag(&flag_holder, 9);
display_32_flags(flag_holder);
return 0;
}
void unset_flag(unsigned int * flag_holder, int flag_position)
{
*flag_holder=*flag_holder>>flag_position;
}
void display_32_flags(unsigned int flag_holder)
{
printf (" %d", flag_holder);
}