The C Programming Language Exercise 2_6

来源:互联网 发布:java自学书 编辑:程序博客网 时间:2024/06/05 13:24
/*
* 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 bitsprintf("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位为 Numberx >>= p + 1;  //保留高位的数字,到低位如  1001  p=2.n=2;  1x <<= n;       //移到n位x |= y & ~(~0 << n);  //x确定低n位,x <<= (p - n + 1);x |= t;return x;}//1001 1110  1101int 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 */elsex &= ~(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
原创粉丝点击