查看: 3613| 回复: 6
跳转到指定楼层
上一主题 下一主题
收起左侧

Google : 位逆序

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
给你一个32位的number,把它按位逆序 : 1101001 ==> 1001011

上一篇:Find the longest simple path
下一篇:Google : 找最小窗口
🔗
everwinter 2011-5-21 06:15:02 | 只看该作者
全局:
我只能想到用for循环交换个4次>_<
回复

使用道具 举报

🔗
darksteel 2011-5-21 06:39:33 | 只看该作者
全局:
假设只考虑unsigned的number,并且认为要逆序的部分是从第一个不为0的bit开始到最低位。代码如下:
  1. unsigned int BitWiseReverse(unsigned int n)
  2. {
  3.         int len = 31 - __builtin_clz(n);
  4.         for(int i = 0; i <= len/2; i++)
  5.                 if(((n>>i)&1) != ((n>>len-i)&1))
  6.                         n ^= (1<<i)^(1<<len-i);
  7.         return n;
  8. }
复制代码
回复

使用道具 举报

🔗
LoveScorpio 2011-5-21 22:55:40 | 只看该作者
全局:
编程太搓...也只能想到简单的循环...
回复

使用道具 举报

🔗
clseer 2011-10-6 17:08:23 | 只看该作者
全局:
这个题目有问题吧,1101001逆序的结果应该是:1001 0110 0000 0000 0000 0000 0000 0000
这个可以用交换的方法,先是相邻的两个bit交换,再是相邻四个bit交换,之后是8个,16个分别交换,代码如下:
#define reverse(x)                              /
(x=x>>16|(0x0000ffff&x)<<16,            /
x=(0xff00ff00&x)>>8|(0x00ff00ff&x)<<8, /
x=(0xf0f0f0f0&x)>>4|(0x0f0f0f0f&x)<<4, /
x=(0xcccccccc&x)>>2|(0x33333333&x)<<2, /
x=(0xaaaaaaaa&x)>>1|(0x55555555&x)<<1)
回复

使用道具 举报

🔗
Saber 2011-10-9 03:48:24 | 只看该作者
全局:
这个题目有问题吧,1101001逆序的结果应该是:1001 0110 0000 0000 0000 0000 0000 0000
这个可以用交换的方法,先是相邻的两个bit交换,再是相邻四个bit交换,之后是8个,16个分别交换,代码如下:
#define reverse(x)                              /
(x=x>>16|(0x0000ffff&x)8|(0x00ff00ff&x)4|(0x0f0f0f0f&x)2|(0x33333333&x)1|(0x55555555&x)
clseer 发表于 2011-10-6 17:08


犀利.....................
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表