免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chinesedragon
打印 上一主题 下一主题

求a%16的结果和a&15的结果相等的原理 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-06-05 09:40 |只看该作者
chinesedragon 发表于 2012-06-04 17:03
int a = 2%16;
int b = 2&15;


a%16相当于是取16的模,屏蔽掉高位,只保留低4bits,与a&0xF的操作是一样的,0xF就是15,因此a%16等于a&15

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
12 [报告]
发表于 2012-06-05 10:26 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
13 [报告]
发表于 2012-06-05 10:38 |只看该作者
pmerofc 发表于 2012-06-05 10:26
回复 11# ifreecoding

但"2"可不是负数吧,又不是int c = xx;int a = c % 16;。楼主这问题就没讲清楚。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
14 [报告]
发表于 2012-06-05 12:04 |只看该作者
pmerofc 发表于 2012-06-05 10:26
你忘记int类型的值可以为负了

结果不一致,但在数学层面上看起来似乎都是正确的
http://blog.vckbase.com/bruceteen/archive/2011/12/10/55127.html

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
15 [报告]
发表于 2012-06-05 12:09 |只看该作者
本帖最后由 yulihua49 于 2012-06-05 12:13 编辑
chinesedragon 发表于 2012-06-04 17:03
int a = 2%16;
int b = 2&15;

我更爱用x&15,效率要高一些,不过可能编译器能优化x%16
如果x<0呢?
  1. main()
  2. {
  3. int x=-100;
  4.         printf("x1=%d,x2=%d\n",x&15,x%16);
  5. }
复制代码
x1=12,x2=-4

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
16 [报告]
发表于 2012-06-05 12:18 |只看该作者
看看给优化成啥了:
  1.         .file   "t.c"
  2.         .text
  3.         .p2align 2,,3
  4. .globl itoStr
  5.         .type   itoStr, @function
  6. itoStr:
  7.         pushl   %ebp
  8.         movl    %esp, %ebp
  9.         pushl   %edi
  10.         pushl   %esi
  11.         pushl   %ebx
  12.         subl    $28, %esp
  13.         movl    8(%ebp), %ecx
  14.         testl   %ecx, %ecx
  15.         movl    12(%ebp), %ebx
  16.         movl    %ecx, -20(%ebp)
  17.         js      .L10
  18. .L2:
  19.         movl    $10, %esi
  20.         movl    $1717986919, %edi
  21.         .p2align 2,,3
  22. .L3:
  23.         movl    %ecx, %eax
  24.         cltd
  25.         idivl   %esi
  26.         addl    $48, %edx
  27.         movl    %ecx, %eax
  28.         movb    %dl, (%ebx)
  29.         imull   %edi
  30.         movl    %edx, -28(%ebp)
  31.         movl    %ecx, %eax
  32.         sarl    $2, %edx
  33.         movl    %edx, -32(%ebp)
  34.         cltd
  35.         subl    %edx, -32(%ebp)
  36.         movl    -32(%ebp), %ecx
  37.         incl    %ebx
  38.         testl   %ecx, %ecx
  39.         jg      .L3
  40.         movl    -20(%ebp), %ecx
  41.         testl   %ecx, %ecx
  42.         js      .L11
  43.         movb    $0, (%ebx)
  44.         subl    $12, %esp
  45.         pushl   12(%ebp)
  46.         call    strrevers
  47.         addl    $16, %esp
  48.         leal    -12(%ebp), %esp
  49.         movl    %ebx, %eax
  50.         popl    %ebx
  51.         popl    %esi
  52.         popl    %edi
  53.         leave
  54.         ret
  55. .L10:
  56.         negl    %ecx
  57.         jmp     .L2
  58. .L11:
  59.         movb    $45, (%ebx)
  60.         incl    %ebx
  61.         movb    $0, (%ebx)
  62.         subl    $12, %esp
  63.         pushl   12(%ebp)
  64.         call    strrevers
  65.         addl    $16, %esp
  66.         leal    -12(%ebp), %esp
  67.         movl    %ebx, %eax
  68.         popl    %ebx
  69.         popl    %esi
  70.         popl    %edi
  71.         leave
  72.         ret
  73.         .size   itoStr, .-itoStr
  74.         .ident  "GCC: (GNU) 3.4.3 (csl-sol210-3_4-branch+sol_rpath)"
复制代码

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
17 [报告]
发表于 2012-06-05 12:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
18 [报告]
发表于 2012-06-05 12:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
19 [报告]
发表于 2012-06-05 13:08 |只看该作者
回复 8# 龙骨五钱

不一样。你这个直接用数学上的定义就能推出来。LZ的问题和存储表示相关。

论坛徽章:
0
20 [报告]
发表于 2012-06-05 13:10 |只看该作者
回复 14# bruceteen


不只是模除的问题。
负数表示不见得能保证是补码(尽管大多数都是)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP