using namespace std;
//進行無符號整形數據的位反轉
unsigned int reverse_bits(unsigned int value)
{
unsigned int retVal = 0;
for(int i=1; i!=0; i<<=1) //保證不依賴機器的長度 依次左移 有多少移動多少
{
retVal <<= 1; //左移 使得數據有餘留的空間
if(value & 1) //進行比較 如果有1 就進行數據的添加
retVal |= 1;
value >>= 1; //下一個數據比較
}
return retVal;
}
bool isReasonable(char bit_array[], unsigned int bit_number)
{
int len = strlen(bit_array);
if(bit_number <0 || bit_number > len)
return false;
return true;
}
//實現位數組
void set_bit(char bit_array[], unsigned int bit_number) //用於將指定的位清1
{
if(isReasonable(bit_array,bit_number))
bit_array[bit_number] = '1';
}
void clear_bit(char bit_array[], unsigned int bit_number) //用於將制定位清0
{
if(isReasonable(bit_array,bit_number))
bit_array[bit_number] = '0';
}
//用於將制定位清0 或者設置爲1 有點不明白啊 還是把value 改成如下形式吧
void assign_bit(char bit_array[], unsigned int bit_number, bool bOk)
{
if(isReasonable(bit_array,bit_number))
if(bOk)
bit_array[bit_number] = '0'; //如果true 則設置爲0 否則爲1
else
bit_array[bit_number] = '1';
}
bool test_bit(char bit_array[], unsigned int bit_number)
{
if(isReasonable(bit_array,bit_number))
if(bit_array[bit_number] == '0')
return true;
return false;
}
//把一個給定的值存儲到一個整數中指定的幾位
int store_bit_field(int original_value, int value_to_store, unsigned int starting_bit, unsigned int ending_bit)
{
int mask = 0;
int i;
//在此過程中 endint_bit比starting_bit要小
for (i = ending_bit; i <= starting_bit; i++)
{
mask ^= (1 << i); //根據提示 將需要的那些偉設置爲1 原理 將1左移i即可
}
original_value = (~mask) & original_value; //用反碼與原始值執行and操作
mask &= (value_to_store << ending_bit); //將新的指進行左移 並且與掩碼進行and操作
mask |= original_value; //將結果值與原值進行or操作
return mask;
}
void print_bits(unsigned int value)
{
for(int i=31; i>=0; --i) //機器是32位的 就直接這樣寫了
{
cout<<((value>>i)&1);
}
}
int main(void)
{
unsigned int a = 25;
cout<<reverse_bits(a)<<endl;
char aa[] = "0100100100100101010";
set_bit(aa,1);
cout<<test_bit(aa,2)<<endl;
cout<<aa<<endl;
//0 ---> 0
//0000 0000 0000 0000
//0000 0000 0001 0000 ---> 16
cout<<store_bit_field(0, 1, 4, 4)<<endl;
return 0;
}