| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2307 人关注过本帖
标题:位运算
只看楼主 加入收藏
爱是相反梦
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2016-12-23
结帖率:71.43%
收藏
已结贴  问题点数:15 回复次数:23 
位运算
题目:给定两个无符号整数m,n,如果m可以由n通过循环位移得到,就输出yes,否则输出no。

输入输出说明:

输入:
2 4
输出:
yes


m通过n循环位移得到这句话不理解,请大神指点一二,小弟感激不尽!
2017-01-01 00:54
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
要转化成二进制才能看出来~~~~

2(2)=10 4(2)=100  2(2)可以通过把1向右移动1位得到4(2)~~~

[此贴子已经被作者于2017-1-1 01:01编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-01 00:59
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这题的位运算应该用>>或者<<的组合~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-01 01:05
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
试试这样~

程序代码:
#include<stdio.h>
int main()
{
    unsigned int m,n;
    scanf("%u%u",&m,&n);

    if (m>n)
    {
        n^=m;//交换数字
        m^=n;
        n^=m;
    }

    while (m<n)
        m<<=1;

    if (n==m)
        printf("Yes\n");
    else
        printf("No\n");

    return 0;
}


[此贴子已经被作者于2017-1-1 01:10编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-01 01:09
爱是相反梦
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2016-12-23
收藏
得分:0 
回复 3楼 九转星河
if (m>n)
    {
        n^=m;//交换数字
        m^=n;
        n^=m;
    }

版主,这里看不懂,怎么都是n,m换来换去的,跟三元交换不一样的,怎么换的??
2017-01-01 01:58
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
要求只能用位移的话,试试这样可否:
#include<stdio.h>
main()
{
    unsigned int i, bits, m, n;
    scanf("%u%u",&m,&n);
    bits = 8 * sizeof(unsigned int);
    for (i=0; i<bits; i++)
        if ((n<<i)==m || ((n>>i)==m))
            break;
    if (i < bits)
        printf("yes");
    else
        printf("no");
}
2017-01-01 06:05
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:3 
#include<stdio.h>
int Digits(int n)
{
    int digit=1;
    while(n>>=1>0) digit++;
    return digit;
}
int Leftward(int n,int m)//n循环位移得到m返1,不能返0
{
    int digits=Digits(n);int times=digits;
    while(times--)
    {
        n=((n&1)<<(digits-1))+(n>>1);
        if(n==m) return 1;
    }
    return 0;
}
int main()
{
    int n,m;
    printf("输入一个n值:");scanf("%d",&n);
    printf("输入一个m值:");scanf("%d",&m);
    printf("n=%d,m=%d,n循环移动得到m的可能性为:%d",n,m,Leftward(n,m));
    return 0;
}
2017-01-01 18:41
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
突然发现四楼水贴,对最高位处理有个bug,于是完善了一下算法~当然,做出来就算了,我没有去优化比较次数~

程序代码:
#include<stdio.h>
int main()
{
    unsigned int a=1;
    unsigned int b=1;
    unsigned int n=0,m=0;
    int count=0;

    while (a)//获取数位
    {
        a<<=1;
        count++;
    }
    b<<=count-1;//获取最高位

    scanf("%u%u",&n,&m);//输入两个数

    while (count--)
    {
        if (n==m)
            break;

        if (n>=b)
        {
            n<<=1;
            n|=1;
        }
        else 
            n<<=1;
    }

    if (n==m)
        printf("Yes!\n");
    else 
        printf("No!\n");

    return 0;
}


[此贴子已经被作者于2017-1-2 14:17编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-01 19:23
爱是相反梦
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2016-12-23
收藏
得分:0 
回复 6楼 吹水佬
bits = 8 * sizeof(unsigned int);
这句是什么意思?为什么有个8?
2017-01-02 02:28
爱是相反梦
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2016-12-23
收藏
得分:0 
回复 7楼 yangfrancis
感觉这个代码写得好,但看不懂digits函数的作用是什么
2017-01-02 02:36
快速回复:位运算
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.174766 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved