Chinaunix首页 | 论坛 | 博客
  • 博客访问: 437569
  • 博文数量: 71
  • 博客积分: 26
  • 博客等级: 民兵
  • 技术积分: 1246
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-23 14:46
个人简介

linux --- 一切皆文件

文章分类

全部博文(71)

文章存档

2021年(1)

2019年(2)

2018年(4)

2017年(7)

2016年(11)

2015年(1)

2014年(2)

2013年(33)

2012年(10)

分类: C/C++

2013-05-19 21:01:44

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





阅读(1277) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~