原理部分以单字节数为例,代码部分实现了单字节,双字节,四字节的算法。
一个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; } }