BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #21525同步于 2007/10/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

[合集] 如何写一个判断一个数是否是2的幂次方的宏啊?

CNLAS
2007/10/3镜像同步0 回复
☆─────────────────────────────────────☆ tenor (最后的战役) 于 (Sat Sep 22 23:48:40 2007) 提到: 去计算所面试被鄙视了。 ☆─────────────────────────────────────☆ Jarod (轻轻地我走了) 于 (Sat Sep 22 23:59:52 2007) 提到: 同被BS。不会 ☆─────────────────────────────────────☆ daodao (刀刀) 于 (Sun Sep 23 00:07:40 2007) 提到: 余数。。 ☆─────────────────────────────────────☆ coolfantasy (Cool) 于 (Sun Sep 23 00:11:59 2007) 提到: (n - 1) & n 结果为0的是2的mi ☆─────────────────────────────────────☆ johnavon (Emacs) 于 (Sun Sep 23 00:12:29 2007) 提到: 很经典的哦 【 在 coolfantasy 的大作中提到: 】 : (n - 1) & n : 结果为0的是2的mi ☆─────────────────────────────────────☆ tenor (最后的战役) 于 (Sun Sep 23 00:15:16 2007) 提到: 【 在 johnavon 的大作中提到: 】 : 很经典的哦 这是面试常问的题吧? 唉 ☆─────────────────────────────────────☆ johnavon (Emacs) 于 (Sun Sep 23 00:21:20 2007) 提到: 这个不知道 我们班一个搞ACM的经常给我们“炫耀”类似的东西。。。 【 在 tenor 的大作中提到: 】 : 这是面试常问的题吧? : 唉 ☆─────────────────────────────────────☆ wks (cloverprince) 于 (Sun Sep 23 00:28:23 2007) 提到: 接着问一下,在知道这个数是2的若干次方的情况下,能不能用宏判断是几次方呢? ☆─────────────────────────────────────☆ zwz (ERA-The Mass) 于 (Sun Sep 23 01:02:13 2007) 提到: 10大留名 ☆─────────────────────────────────────☆ nusher (相逢恨早) 于 (Sun Sep 23 01:06:59 2007) 提到: 技术帖 ☆─────────────────────────────────────☆ IchijyouSan (一条さん|一条大神) 于 (Sun Sep 23 01:07:01 2007) 提到: 听说是十大...... ☆─────────────────────────────────────☆ mmgroup (からす) 于 (Sun Sep 23 01:20:26 2007) 提到: 【 在 coolfantasy 的大作中提到: 】 : (n - 1) & n : 结果为0的是2的mi 顶正解.... 判断是否一个1加一堆0……就这样…… ☆─────────────────────────────────────☆ wgynze (cheetah) 于 (Sun Sep 23 01:20:27 2007) 提到: 太技术贴了 ☆─────────────────────────────────────☆ bj2k08 (戒网) 于 (Sun Sep 23 01:23:43 2007) 提到: 哇 ☆─────────────────────────────────────☆ Exciting (Sa) 于 (Sun Sep 23 01:28:10 2007) 提到: 顶!!! 北邮人要多发技术贴! ☆─────────────────────────────────────☆ thisfeeling (胖胖的尼采) 于 (Sun Sep 23 01:37:17 2007) 提到: 哈哈 ☆─────────────────────────────────────☆ coolfantasy (Cool) 于 (Sun Sep 23 01:46:01 2007) 提到: #define f(x, y) while ((x = (x >> 1)) != 0) y++; 不要B4我。。。 【 在 wks (cloverprince) 的大作中提到: 】 : 接着问一下,在知道这个数是2的若干次方的情况下,能不能用宏判断是几次方呢? ☆─────────────────────────────────────☆ lg200303 (slight) 于 (Sun Sep 23 01:47:40 2007) 提到: re ☆─────────────────────────────────────☆ abao (此时 我未成名卿未嫁) 于 (Sun Sep 23 01:51:35 2007) 提到: 受教了 ☆─────────────────────────────────────☆ airbyr (Arcueid.Brunestud) 于 (Sun Sep 23 01:53:52 2007) 提到: 技术难得十大 ☆─────────────────────────────────────☆ angriest (超级无敌小豆芽) 于 (Sun Sep 23 02:07:05 2007) 提到: 【 在 mmgroup 的大作中提到: 】 : 顶正解.... : 判断是否一个1加一堆0……就这样…… 还是不太明白。。 ☆─────────────────────────────────────☆ baoda (baoda) 于 (Sun Sep 23 02:22:01 2007) 提到: 不知道 ☆─────────────────────────────────────☆ zwz (ERA-The Mass) 于 (Sun Sep 23 03:04:14 2007) 提到: 【 在 angriest 的大作中提到: 】 : 还是不太明白。。 2进制位与 ☆─────────────────────────────────────☆ zwz (ERA-The Mass) 于 (Sun Sep 23 03:11:32 2007) 提到: 【 在 wks 的大作中提到: 】 : 接着问一下,在知道这个数是2的若干次方的情况下,能不能用宏判断是几次方呢? 可以验证是否是2的几次方,但是计算出是几次方似乎不好实现。。。。。。 ☆─────────────────────────────────────☆ taotie1984 (北邮人) 于 (Sun Sep 23 03:24:14 2007) 提到: 转换成2进制,判断有几个零就可以知道是几次方了 ☆─────────────────────────────────────☆ zwz (ERA-The Mass) 于 (Sun Sep 23 04:10:05 2007) 提到: 【 在 taotie1984 的大作中提到: 】 : 转换成2进制,判断有几个零就可以知道是几次方了 数据类型是int还是uint还是double?2进制位数不是和数据类型相关么。而且用宏怎么判断有几个0? 给段代码吧。。。。 ☆─────────────────────────────────────☆ Jarod (轻轻地我走了) 于 (Sun Sep 23 08:31:43 2007) 提到: 技术贴啊 ☆─────────────────────────────────────☆ seaver (benny) 于 (Sun Sep 23 08:44:10 2007) 提到: 对 【 在 zwz 的大作中提到: 】 : 数据类型是int还是uint还是double?2进制位数不是和数据类型相关么。而且用宏怎么判断有几个0? : 给段代码吧。。。。 ☆─────────────────────────────────────☆ mikebibby (万安人) 于 (Sun Sep 23 08:56:13 2007) 提到: 【 在 coolfantasy 的大作中提到: 】 : (n - 1) & n : 结果为0的是2的mi 相当的不错,呵呵 ☆─────────────────────────────────────☆ feiyangdn (feiyangdn) 于 (Sun Sep 23 09:37:53 2007) 提到: 用汇编实现很简单,主要用到的指令BT,BTR BT---测试重最右端开始的某位非零 BTR--对某位清零 int xc;//被测试数 int yc;//结果为-1表示非2的幂次方,其他值为相应次方 _asm{ mov eax,xc; bt ebx,eax; /*测试*/ mov yc,ebx; btr eax,ebx; /*清零*/ cmp eax,0; /*判断清掉了xc中可能存在的最低bit的1之后的数是否为0*/ jnz xxx; mov yc,-1; xxx: nop; } 写汇编比较枯燥, 而且容易出错,如果速度没有要求建议不. ☆─────────────────────────────────────☆ evengine (北邮人) 于 (Sun Sep 23 09:41:45 2007) 提到: 顶关于技术的帖子 ☆─────────────────────────────────────☆ windam (windam) 于 (Sun Sep 23 10:13:29 2007) 提到: cool的思路果然很快啊。。。 看到问题就有答案了。。。= = ☆─────────────────────────────────────☆ atian25 (蓝虫|阿天) 于 (Sun Sep 23 10:13:43 2007) 提到: 话说来我这面试的..没几个会回答3388的24点问题.. 真无语... ☆─────────────────────────────────────☆ skyapple (skyapple) 于 (Sun Sep 23 10:20:21 2007) 提到: 2的密次方 即 2的0,1,2,3....次方,即1,2,4,8.... 用二进制表示就是 1 10 100 1000 10000 ..... 依次右移判断是否为零不就行了... ☆─────────────────────────────────────☆ alloon (07新人已经登场|八卦帮之地水师) 于 (Sun Sep 23 10:37:32 2007) 提到: 以后我就去投奔你了。。。 【 在 atian25 的大作中提到: 】 : 话说来我这面试的..没几个会回答3388的24点问题.. 真无语... ☆─────────────────────────────────────☆ daHe (嗜血的罗密欧) 于 (Sun Sep 23 10:54:36 2007) 提到: 【 在 skyapple 的大作中提到: 】 : 2的密次方 即 2的0,1,2,3....次方,即1,2,4,8.... : 用二进制表示就是 : 1 : ................... 这样简单的描述很多人都会,关键是写出代码就难了 ☆─────────────────────────────────────☆ Barbarosa (巴巴罗沙是海盗) 于 (Sun Sep 23 11:00:17 2007) 提到: 位运算很强大,技术贴得顶 ☆─────────────────────────────────────☆ daHe (嗜血的罗密欧) 于 (Sun Sep 23 11:03:18 2007) 提到: 【 在 wks 的大作中提到: 】 : 接着问一下,在知道这个数是2的若干次方的情况下,能不能用宏判断是几次方呢? 如果该数是int型,至少有下面这种方法;long型也可以如法炮制的写下去,无非就是再长一些。如果是float或double型,就先强制转换成int或者long。 #define f(n) (n==0)+\ (n==2)*1+\ (n==4)*2+\ (n==8)*3+\ (n==16)*4+\ (n==32)*5+\ (n==64)*6+\ (n==128)*7 ☆─────────────────────────────────────☆ flyinghawk (鹰击长空) 于 (Sun Sep 23 11:07:31 2007) 提到: 【 在 feiyangdn 的大作中提到: 】 用汇编实现很简单,主要用到的指令BT,BTR BT---测试重最右端开始的某位非零 BTR--对某位清零 int xc;//被测试数 int yc;//结果为-1表示非2的幂次方,其他值为相应次方 _asm{ mov eax,xc; bt ebx,eax; /*测试*/ mov yc,ebx; btr eax,ebx; /*清零*/ cmp eax,0; /*判断清掉了xc中可能存在的最低bit的1之后的数是否为0*/ jnz xxx; mov yc,-1; xxx: nop; } 厉害啊 ☆─────────────────────────────────────☆ zhizi (一一) 于 (Sun Sep 23 11:22:21 2007) 提到: 我就是顶一下~ ☆─────────────────────────────────────☆ vivin (阿诺) 于 (Sun Sep 23 11:48:20 2007) 提到: 受教了. 【 在 coolfantasy 的大作中提到: 】 : (n - 1) & n : 结果为0的是2的mi ☆─────────────────────────────────────☆ fullhappy (游泳的鱼) 于 (Sun Sep 23 11:57:38 2007) 提到: 受教了 ☆─────────────────────────────────────☆ freewings (新的旅程) 于 (Sun Sep 23 12:31:03 2007) 提到: 用二进制思考比较直接,一个1跟一堆0 就容易理解了 ☆─────────────────────────────────────☆ phoenix1104 (Ashlee Simpson) 于 (Sun Sep 23 12:39:37 2007) 提到: 嗯 【 在 johnavon 的大作中提到: 】 : 这个不知道 : 我们班一个搞ACM的经常给我们“炫耀”类似的东西。。。 ☆─────────────────────────────────────☆ Kadon (SeekIng) 于 (Sun Sep 23 12:41:05 2007) 提到: 俺水平太低 看不懂 ☆─────────────────────────────────────☆ wks (cloverprince) 于 (Sun Sep 23 13:35:07 2007) 提到: 没有bs的意思. 这几天编程碰巧遇到了这个问题需要解决. 谢谢啦. 【 在 coolfantasy 的大作中提到: 】 : #define f(x, y) while ((x = (x >> 1)) != 0) y++; : 不要B4我。。。 ☆─────────────────────────────────────☆ lili (lili) 于 (Sun Sep 23 13:49:02 2007) 提到: ding ☆─────────────────────────────────────☆ zwz (ERA-The Mass) 于 (Sun Sep 23 15:20:56 2007) 提到: 【 在 daHe 的大作中提到: 】 : 这样简单的描述很多人都会,关键是写出代码就难了 >>和 &0x01,这个不难,问题是在不知道数据类型的情况下用一个宏同时判断多个位,这个比较难 ☆─────────────────────────────────────☆ zwz (ERA-The Mass) 于 (Sun Sep 23 15:26:31 2007) 提到: 【 在 atian25 的大作中提到: 】 : 话说来我这面试的..没几个会回答3388的24点问题.. 真无语... 这个我会。。。。恩 ☆─────────────────────────────────────☆ kai (雅典娜的凯子) 于 (Sun Sep 23 16:07:56 2007) 提到: 技术贴上十大了,一定要顶 ☆─────────────────────────────────────☆ xiaojia164 (【顶你小分队】│虢虓湛卢) 于 (Sun Sep 23 16:10:07 2007) 提到: 原来位运算如此强大。 ☆─────────────────────────────────────☆ maroon (mumu) 于 (Sun Sep 23 18:44:35 2007) 提到: 【 在 coolfantasy 的大作中提到: 】 : (n - 1) & n : 结果为0的是2的mi 受教了, 不过这个队所有类型的数都成立么? ☆─────────────────────────────────────☆ keen (keen) 于 (Sun Sep 23 19:48:05 2007) 提到: gongtongxuexi ☆─────────────────────────────────────☆ jhx0129 (jhx) 于 (Sun Sep 23 20:28:10 2007) 提到: 不看都知道你牛 【 在 feiyangdn 的大作中提到: 】 : 用汇编实现很简单,主要用到的指令BT,BTR : BT---测试重最右端开始的某位非零 : BTR--对某位清零 : ................... ☆─────────────────────────────────────☆ AgCl (0o游水部o0【一等公爵】|SANJI) 于 (Sun Sep 23 20:28:12 2007) 提到: 看到最后"的宏"两个字就不知道在说什么了 ☆─────────────────────────────────────☆ SunFlowers () 于 (Sun Sep 23 21:03:21 2007) 提到: 问一下 宏写成这样 我 printf("%d\n", f(x,y)) 能运行吗? 【 在 coolfantasy 的大作中提到: 】 : #define f(x, y) while ((x = (x >> 1)) != 0) y++; : 不要B4我。。。 ☆─────────────────────────────────────☆ zwz (ERA-The Mass) 于 (Sun Sep 23 22:10:45 2007) 提到: 【 在 SunFlowers 的大作中提到: 】 : 问一下 宏写成这样 : 我 printf("%d\n", f(x,y)) 能运行吗? 这样语法不通啊 ☆─────────────────────────────────────☆ IchijyouSan (一条さん|一条大神) 于 (Sun Sep 23 22:15:30 2007) 提到: 【 在 SunFlowers 的大作中提到: 】 : 问一下 宏写成这样 : 我 printf("%d\n", f(x,y)) 能运行吗? 所以要换个宏啊 比如说 f(x) (log(x)/log(2)) 嗯 ☆─────────────────────────────────────☆ yanhui (ScST^05409->(伊斯蘭)) 于 (Sun Sep 23 22:25:00 2007) 提到: 十大。。 ☆─────────────────────────────────────☆ czyoyo (yoyo~★`喜欢小猫咪) 于 (Sun Sep 23 22:44:17 2007) 提到: 为什么一点都看不懂..哭 ☆─────────────────────────────────────☆ Bergwolf (计忆邮心|Kinight) 于 (Sun Sep 23 23:56:46 2007) 提到: 这种题直觉都该从位运算做文章 对数运算确实比较新颖^_^ 【 在 IchijyouSan (一条さん|一条大神) 的大作中提到: 】 : 所以要换个宏啊 : 比如说 : f(x) (log(x)/log(2)) : ................... ☆─────────────────────────────────────☆ famed123 (^_^) 于 (Mon Sep 24 00:40:39 2007) 提到: 希望以后多看到这种十大楼。。。。。。。。 少些囧楼上十大就好咯 ☆─────────────────────────────────────☆ aguar (aguar) 于 (Mon Sep 24 00:44:07 2007) 提到: 恩 受教 ☆─────────────────────────────────────☆ powerclark (powerclark) 于 (Mon Sep 24 08:27:45 2007) 提到: bd ☆─────────────────────────────────────☆ dexter88 (Dexter) 于 (Mon Sep 24 11:42:30 2007) 提到: 慢慢来,别急,多接触接触就看知道他们在说什么了,编程的一步一步的学....... ps:我也看不懂:) 【 在 czyoyo 的大作中提到: 】 : 为什么一点都看不懂..哭
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。