原理部分以单字节数为例,代码部分实现了单字节,双字节,四字节的算法。
一个8位(单字节)长度的数某位要设置为0:
要把一个8位(单字节)长度的数某一位设置0, 需要把该数和该位为0,但其他各位都为1的数进行与运算。
举例一:
运算 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
And | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
结果 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
举例二:
运算 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
And | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
结果 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
一个8位(单字节)长度的数某位要设置为1:
要把一个8位(单字节)长度的数某一位设置1, 需要把该数和该位为1,但其他各位都为0的数进行与运算。
举例一:
运算 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
Or | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
结果 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
举例二:
运算 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
Or | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
结果 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
以下为实现代码:
// 实现幂函数 power(constant^x)
//y = constant ^ x
unsigned int power(unsigned int constant, unsigned int x);
//设置一个8位长度无符号整形的某一位为 0 还是 1
//计数从最高位开始为0---7
void setbit(unsigned char& x, unsigned char index, unsigned char value);
//设置一个16位长度无符号整形的某一位为 0 还是 1
//计数从最高位开始为0---15
void setbit(unsigned short& x, unsigned char index, unsigned char value);
//设置一个32位长度无符号整形的某一位为 0 还是 1
//计数从最高位开始为0---31
void setbit(unsigned int& x, unsigned char index, unsigned char value);
//得到一个8位长度无符号整形的某一位是 0 还是 1
//计数从最高位开始为0---15
unsigned char getbit(unsigned char x, unsigned char index);
//得到一个16位长度无符号整形的某一位是 0 还是 1
//计数从最高位开始为0---15
unsigned char getbit(unsigned short x, unsigned char index);
//得到一个32位长度无符号整形的某一位是 0 还是 1
//计数从最高位开始为0---31
unsigned char getbit(unsigned int x, unsigned char index);
//得到二进制字符串
void getbinarystring(unsigned char x, string& binarystr);
void getbinarystring(unsigned short x, string& binarystr);
void getbinarystring(unsigned int x, string& binarystr);
//实现幂函数 y = constant^x
unsigned int power(unsigned int constant, unsigned int x)
{
int multitime = 1;
for(unsigned int i = 0; i < x; i++)
{
multitime = multitime * constant;
}
return multitime;
}
//设置一个8位长度无符号整形的某一位为 0 还是 1
//计数从最高位开始为0---7
void setbit(unsigned char& x, unsigned char index, unsigned char value)
{
int length = sizeof(x) * 8;
if (value == 0)
{
x &= 0xFF - power(2, length - index - 1);
}
else if(value == 1)
{
x |= power(2, length - index - 1);
}
}
//设置一个16位长度无符号整形的某一位为 0 还是 1
//计数从最高位开始为0---15
void setbit(unsigned short& x, unsigned char index, unsigned char value)
{
int length = sizeof(x) * 8;
if (value == 0)
{
x &= 0xFFFF - power(2, length - index - 1);
}
else if(value == 1)
{
x |= power(2, length - index - 1);
}
}
//设置一个32位长度无符号整形的某一位为 0 还是 1
//计数从最高位开始为0---31
void setbit(unsigned int& x, unsigned char index, unsigned char value)
{
int length = sizeof(x) * 8;
if (value == 0)
{
x &= 0xFFFFFFFF - power(2, length - index - 1);
}
else if(value == 1)
{
x |= power(2, length - index - 1);
}
}
//得到一个8位长度无符号整形的某一位是 0 还是 1
//计数从最高位开始为0---7
unsigned char getbit(unsigned char x, unsigned char index)
{
int length = sizeof(x) * 8;
return (power(2, length - index - 1) & x ) >> (length - index - 1);
}
//得到一个16位长度无符号整形的某一位是 0 还是 1
//计数从最高位开始为 0---15
unsigned char getbit(unsigned short x, unsigned char index)
{
int length = sizeof(x) * 8;
return (power(2, length - index - 1) & x ) >> (length - index - 1);
}
//得到一个32位长度无符号整形的某一位是 0 还是 1
//计数从最高位开始为0---31
unsigned char getbit(unsigned int x, unsigned char index)
{
int length = sizeof(x) * 8;
return (power(2, length - index - 1) & x ) >> (length - index - 1);
}
//得到8位长度二进制字符串
void getbinarystring(unsigned char x, string& binarystr)
{
int length = sizeof(x) * 8;
binarystr = "";
for(int i = 0; i < length; i++)
{
binarystr += getbit(x, i) + 48;
}
}
//得到16位长度二进制字符串
void getbinarystring(unsigned short x, string& binarystr)
{
int length = sizeof(x) * 8;
binarystr = "";
for(int i = 0; i < length; i++)
{
binarystr += getbit(x, i) + 48;
}
}
//得到32位长度二进制字符串
void getbinarystring(unsigned int x, string& binarystr)
{
int length = sizeof(x) * 8;
binarystr = "";
for(int i = 0; i < length; i++)
{
binarystr += getbit(x, i) + 48;
}
}