现在的位置: 首页 > 综合 > 正文

一个整形数,如何把某位设置为 0 或者 1

2019年01月11日 ⁄ 综合 ⁄ 共 2970字 ⁄ 字号 评论关闭

原理部分以单字节数为例,代码部分实现了单字节,双字节,四字节的算法

一个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;
	}
}

 

抱歉!评论已关闭.