位运算

来源:互联网 发布:javascript数组定义 编辑:程序博客网 时间:2024/06/06 17:06

位运算中设计到的操作有:与、或、非、异或、左移、右移。

题目一:

请实现一个函数,输入一个整数,输出该数二进制表示中1的个数,例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2。

分析:
1.将给定的整数右移,并且判断每一次右移之后最低位是否为1.
2.设置一个flag,每次将flag左移,判断给定的整数每一位是否为1.
3.将一个数与它减一相与,会将这个数最右边的1变为0.

一、
这种解法在给定的整数是正数时可以正常得到答案,但是在给出的数是负数时,因此负数右移最高位补符号位,所以这种解法可能会引起死循环。

int numberOf1_0( int n ){    int result = 0;    while ( n )    {        if ( n & 1 )            ++result;        n = n >> 1;    }    return result;}

二、
解决上一个解法出现的死循环问题的新解法。

int numberOf1( int n ){    int result = 0;    unsigned int flag = 1;    while ( flag )    {        if ( n & flag )         {            ++result;         }        flag = flag << 1;    }    return result;}

三、
令人眼前一亮的解法。

int numberOf1_2( int n ){    int result = 0;    int old_n;    while ( n )    {        n = ( n-1 ) & n;        result ++;    }    return result;}

结论:

把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边一个1变成0。

拓展题目:
一、用一条语句判断一个整数是不是3的整数次方。
二、输入两个整数m和n,计算需要改变m的二进制表示中的多少次才能得到n。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 熹妃q传密码忘了怎么办 苹果手机淘宝占用空间大怎么办 苹果相册储存空间不足怎么办 企业网银里的收款名单丢失怎么办 发邮件发错了怎么办 qq群成员满500了怎么办 为什么qq群查不到信息怎么办 tiger杯子油漆划掉了怎么办 手被油漆弄到了怎么办 被油漆弄到衣服怎么办 QQ发表情成问号怎么办 qq登不了微信怎么办 qq不能登录微信怎么办 qq号一年没用了怎么办 微信里别人可以看到我手机号怎么办 用手机号注册的微信换号后怎么办 微信群推送名片很多人加怎么办 志高制冷显示ff怎么办 百度账号手机号换了怎么办 别人盗取手机号的通讯录该怎么办 58简历看不到真实号码怎么办 淘宝更换手机号码说已注册怎么办 系统把qq冻结了怎么办 qq被永久冻结好友怎么办 群发不小心发错怎么办 qq群成员满了怎么办 qq知道密码没手机号验证怎么办 改房本上的名字怎么办 支付宝租给别人怎么办 微信麻将房间卡怎么办 皮肤挤伤了发黑怎么办 指甲被挤了黑了怎么办 手指被挤了变黑怎么办 榆次买房太原户口怎么办 皮肤又红又黑怎么办 打仙桃晃晃老输怎么办 微信支付忘了摇怎么办 苹果手机微信摇一摇摇不了怎么办 打麻将牌背的时候怎么办 打麻将背的时候怎么办 同城游台球初使化失败怎么办