1:编写函数 setbits(x,p,n,y),将x的从p位开始的n位用y最右边的n位代替
分析如下:
先将从p位开始的n位置为 0
yyyyyy……xxxx……yyyy
11111……0000……1111
假设 100100100 ,p 为 8 ,n为 4,y 1111111111 (从左往右从0开始计数)
(~0 << n) 10000
(~(~0 << n)) << (p+1 -n) 01111 << 4 011110000
~((~(~0 << n)) << (p+1 -n) ) 100001111
x & ~((~(~0 << n)) << (p+1 -n) ) 100000100
将y最右边的n的位取出:
yyyyy…… xxxx
0000…… 1111
(y & ~(~0 << n) ) << (p + 1 - n)
unsigned setbits(unsigned x,int p,int n,unsigned y)
{
return x & ~((~(~0 << n)) << (p+1 -n) ) | (y & ~(~0 << n) ) << (p + 1 - n) ;
}
2:编写一个invert(x,p,n),对x执行如下操作,从p位开始的n位进行翻转
yyyyyyy……xxxxx……yyyyy
^ (异或符号,相同则为0,不同为1. 0^0 == 0 1^1 == 0 1^0 == 1 0^0 ==1)
000000……11111……0000
-----------------------------------------
yyyyyy……nnnnn……yyyyy
unsigned invert(unsigned x,int p,int n)
{
return x ^ (~(~0 << n) << (p + 1 - n));
}
3:编写一个函数rightrot(x,n),该函数将 x循环右移n位
先把1和x的最右边的位&操作,然后将这个位左移unsigned位,复制给brit
x右移1位,然后这个位和brit进行&操作。为啥选择unsigned呢,因为只有正数左移才是填补0。
static int wordlength(void); /*由于不同机器的unsigned不确定,所以为了保证可移植性,这个len得自己计算)*/
unsigned rightrot(unsigned x,int n)
{
int brit;
while(n --){
brit = (x & 1) << wordlenth() ;
x = x >> 1;
x = x | brit;
}
}
static int wordlenth(void)
{
int i;
unsigned v = (unsigned) ~0;
for(i = 0; (v = v >> 1) != 0;i ++){
;
}
return i;
}
阅读(1294) | 评论(0) | 转发(0) |