| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2248 人关注过本帖
标题:位运算
只看楼主 加入收藏
爱是相反梦
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2016-12-23
收藏
得分:0 
回复 8楼 九转星河
while (a)//获取数位
    {
        a<<=1;
        count++;
    }
问:当a=0时结束循环,a<<1是左移实现a=0;以二进制实现的,如a=5,二进制就是0000 0101 则a的数位就是3对吗?


    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");

如果n,m的二进制是0010 1000和0001 0010  那只取最高位会不会有问题?? 还是我理解错了??
2017-01-02 02:48
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:5 
程序代码:
#include <stdio.h>
void main()
{
    unsigned int m,n;
    scanf("%u%u",&m,&n);
    for(;!(m%2)&&m;m/=2);
    for(;!(n%2)&&n;n/=2);
    if(m==n)printf("Yes\n");
    else printf("No\n");
}
2017-01-02 07:05
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:2 
以下是引用爱是相反梦在2017-1-2 02:28:58的发言:

bits = 8 * sizeof(unsigned int);
这句是什么意思?为什么有个8?

位长,按8位一字节算,并不通用,可能不适合某些设备或特定的数据类型。
2017-01-02 07:07
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 11楼 爱是相反梦
a赋初值为1,count我的vc编译环境下运行是32,也就是说是32位,是一个不会随n,m改变而改变的定值,n&=1请注意,这里是n|=1,水贴~~~  要结合前文的n>=b来理解b是1左移count-1个数位也就是说是1000000……0(只有最高位是1)n>=b意思是当n的最高位为1时再左移会丢失最高位的1,由于题目要求循环移动,因此最低位要补1,
避免1000000……1与11比较的bug~

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


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-02 10:08
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
回复 14楼 九转星河
我也没看清题意,原来要循环位移,修改后的代码如下:
程序代码:
#include <stdio.h>
void main()
{
    unsigned int m,n,i,k,l;
    l=sizeof(int)*8;
    k=1<<l-1;
    scanf("%u%u",&m,&n);
    for(i=0;i<l&&m!=n;i++)m=(m/2)|((m%2)*k);
    if(i<l)printf("Yes\n");
    else printf("No\n");
}


//测试数字3489660928、2684354561即可知道是否正确,这两个数字分别对应16进制0xD0000000和0xA0000001。8楼代码测试未通过。

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

2017-01-02 13:14
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 15楼 xzlxzlxzl
哦哦,看来我位运算还是不过关 要认真看看代码,还有 为什么要拿八楼的而不拿别的代码比较~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-02 13:49
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
回复 10楼 爱是相反梦
计算该输入数的二进制是多少位。
2017-01-02 13:54
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 15楼 xzlxzlxzl
突然明白了不是n&=1,而是n|=1,水了现在八楼的代码可以过了吧~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-02 14:23
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用九转星河在2017-1-2 14:23:49的发言:

突然明白了不是n&=1,而是n|=1,水了现在八楼的代码可以过了吧~~

m = D0000000(16) = 11010000000000000000000000000000(2)
n = A0000001(16) = 10100000000000000000000000000001(2)
这时,m可以由n通过位移得到吗?
2017-01-02 14:55
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 19楼 吹水佬
手机测试~这个我没有经过细测,有电脑用时再看看~但感觉思路没错,应该是算法问题~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-02 15:01
快速回复:位运算
数据加载中...
 
   



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

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