/*
* 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.
*/
* 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");
*/
}