The C Programming Language Exercise 2_6

/*
* Exercise 2-6 Write a function setbits( x, p, n, y ) that
* returns x with the n bits that begin at position p set to
* the rightmost n bits of y, leaving the other bits unchanged.
*
* fduan, Dec. 13, 2011.
  练习2-6  编写一个函数setbits(x, p, n, y) ,返回对x做如下处理得到的值: x从第p位开始的n
位被置为y的最右边n位的值,其余各位保持不变。


Exercise  2-7.Write a function  invert(x,p,n) that returns  x with the  n bits that begin at
position p inverted (i.e., 1 changed into 0 and vice versa), leaving the others unchanged.
*/
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
void print_bin(int n);


unsigned invert_thomas(unsigned x, int p, int n)
{
	unsigned lowBits,highBits;
	assert(p >= n);
	printf("X的二进制数\n");
	print_bin(x);
	lowBits = x&~(~0 << (p - n + 1)); //unchanged lower bits
	printf("lowBits的二进制数\n");
	print_bin(lowBits);
	highBits = x&(~0 << (p + 1)); //unchanged bits
	/*highBits = highBits << (p + 1);*/


	printf("highBits的二进制数\n");
	print_bin(highBits);


	x = ~x; //取反  //全部取反了
	//x = x&(~0 << (p - n + 1));  //屏蔽两边,
	x = (x&(~0 << (p - n + 1))| lowBits);    //屏蔽左边,
	printf("屏蔽左边最低位变二进制位\n");
	print_bin(x);
	x = (x&~(~0 << (p + 1))) | highBits;    //屏蔽右边,或上右边
	//x |= highBits;
	return x;
}
unsigned setbits(unsigned x, int p, int n, unsigned y)
{
	unsigned t;  /* unchanged lower bits */
	assert(p >= n);
	t = x & ~(~0 << (p - n + 1));  //只要低.  低2-2+1,低xx位为 Number
	x >>= p + 1;  //保留高位的数字,到低位如  1001  p=2.n=2;  1
	x <<= n;       //移到n位
	x |= y & ~(~0 << n);  //x确定低n位,
	x <<= (p - n + 1);
	x |= t;
	return x;
}
//1001 1110  1101
int setbits1(int x, int p, int n, int y)
{
	int i;


	for (i = p; i < n; i++){
		if (y & 1)
			x |= (1 << i);     /* set 1 */
		else
			x &= ~(1 << i);     /* clear 0 */
	}
	return x;
}


int invert(int x, int p, int n)
{
	int i;


	for (i = p; i < n; i++){
		x ^= (1 << i);          /* invert */
	}
	return x;
}




int main()
{
	int x = 9, y = 10;
	int p = 3, n = 2;
	printf("x从第p位开始的n位被置为y的最右边n位的值,其余各位保持不变\n");
	printf("x=%d\n",x);
	print_bin(x);
	print_bin(y);
	printf("%d位开始后%d个位置\n", p, n);
	//printf("%u\n", ivert(x, p, n, y));
	//printf("%d\n", ivert(x, p, n, y));
	print_bin(invert_thomas(x, p, n));
	//print_bin(ivert(x, p, n, y));
	return 0;
}


//打印二进制函数
void print_bin_thomas(int n)
{
	
	char binStor[33]; //int的范围比较大 从[-2^31,2^31 -1],所以取18可能会有问题
	//实现进制转换扩展库里面已经提供了很好的函数了,拿来用就可以了
	//需要注意的是加一下头文n件
	//2就是表示2进制。。你还可以换成任何你想要的进制
	_itoa_s(n, binStor, 2);   //版本不一样,使用的形式不一样
	printf("%s\n", binStor);
	/*
	int l = sizeof(n)* 8;//总位数。
	int i;
	if (l == 0)
	{
	printf("0");
	return;
	}
	for (i = l - 1; i >= 0; i--)//略去高位0.
	{
	if (n&(1 << i)) break;
	}


	for (; i >= 0; i--)
	printf("%d", (n&(1 << i)) != 0);
	printf("\n");
	*/
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值