练习2-8 编写一个函数rightrot(x,n),该函数返回将x循环右移n(二进制)位后所得到的值

来源:互联网 发布:网络语吊打是什么意思? 编辑:程序博客网 时间:2024/04/30 11:12

测试:

#include <stdio.h>unsigned rightrot(unsigned x,int n);int wordlength(void);main(){    unsigned x;    int n;    x=111;    n=3;    rightrot(x,n);}unsigned rightrot(unsigned x,int n){    int wordlength(void);    int wl;    wl=wordlength();    printf("wl:%d",wl);    x=(x&~(~0<<n%wl))<<(wl-n%wl);/* 7左移29位 */    return x;}int wordlength(void){    int i;    unsigned v=(unsigned)~0;    for(i=1;(v=v>>1)>0;i++)        ;    return i;}

输出为什么为-2^29:

-536870912
     0000 0000 0000 0000 0000 0000 0000 0111 << 29补码:1110 0000 0000 0000 0000 0000 0000 0000反码:1101 1111 1111 1111 1111 1111 1111 1111原码:1010 0000 0000 0000 0000 0000 0000 0000     0000 0000 0000 0000 0000 0000 0000 0111 << 30补码:1100 0000 0000 0000 0000 0000 0000 0000反码:1011 1111 1111 1111 1111 1111 1111 1111原码:1100 0000 0000 0000 0000 0000 0000 0000

定义unsigned返回却变成了signed类型。

#include <stdio.h>void rightrot(unsigned x,int n);int wordlength(void);main(){    unsigned x;    int n;    x=111;    n=3;    rightrot(x,n);}void rightrot(unsigned x,int n){    int wordlength(void);    int wl;    wl=wordlength();    printf("wl:%d",wl);    x=(x&~(~0<<n%wl))<<(wl-n%wl);/*7 左移29位 */    printf(" x:%u",x);}int wordlength(void){    int i;    unsigned v=(unsigned)~0;    for(i=1;(v=v>>1)>0;i++)        ;    return i;}

输出

wl:32 x:3758096384
#include <stdio.h>unsigned rightrot(unsigned x,int n);int wordlength(void);main(){    unsigned x;    int n;    x=111;    n=3;    rightrot(x,n);}unsigned rightrot(unsigned x,int n){    int wordlength(void);    int wl;    wl=wordlength();    printf("wl:%d",wl);    x=((x&~(~0<<n))<<(wl-n%wl))|(x>>n);    return x;}int wordlength(void){    int i;    unsigned v=(unsigned)~0;    for(i=1;(v=v>>1)>0;i++)        ;    return i;}

n超过wl时,移动n%wl位。

0 0
原创粉丝点击