免费注册 查看新帖 |

Chinaunix

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

不用四则运算,怎么实现 var = var+1 ? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2006-10-26 15:49 |只看该作者
原帖由 r2007 于 2006-10-19 13:45 发表
查表算不算?
a[256]={1,2,3,...,255,0}
var=a[var]

呵呵!也不错!

论坛徽章:
0
32 [报告]
发表于 2006-12-22 09:13 |只看该作者
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. int incr(int i)
  4. {
  5.         int j = ~i ;
  6.         unsigned int k = 1, prek;

  7.         while (!(j & k))
  8.         {
  9.                 prek = k;
  10.                 k <<= 1;
  11.                 k |= prek;
  12.         }
  13.        
  14.         return (i ^ k);
  15. }
  16. int main(int argc, char * argv[])
  17. {
  18.         int i;
  19.        
  20.         if (argc == 2)
  21.         {
  22.                 i = atoi(argv[1]);
  23.                 i = incr(i);

  24.                 printf("result:%d\n", i);
  25.         }
  26.         else
  27.         {
  28.                 printf("useage:command {number}\n");
  29.         }

  30. }
复制代码

论坛徽章:
0
33 [报告]
发表于 2006-12-22 10:27 |只看该作者
如果Var的原值是-1,-2,-3,-(MAX_INT+1)
和MAX_INT各位你们的算法的结果会不会很奇怪呢???????????

论坛徽章:
0
34 [报告]
发表于 2006-12-22 10:35 |只看该作者
自己做一个CPU加法器,多此一举,反而很慢,位运算在做乖法时还可以考虑一下.

论坛徽章:
0
35 [报告]
发表于 2006-12-22 15:35 |只看该作者
  1. struct CharPair {
  2.   char first;
  3.   char second;
  4. };

  5. typedef int TYPE;

  6. TYPE increase_one( TYPE var )
  7. {
  8.   return (TYPE)&((struct CharPair*)var)->second;
  9. }

  10. #include <stdio.h>

  11. int main( void )
  12. {
  13.   TYPE var = 9;

  14.   printf( "%d\n", increase_one( var ) );

  15.   return 0;
  16. }
复制代码

只要是整数类型,并且不超出指针类型大小,正负都可以。

论坛徽章:
0
36 [报告]
发表于 2006-12-22 15:59 |只看该作者
原帖由 whyglinux 于 2006-12-22 15:35 发表
[code]struct CharPair {
  char first;
  char second;
};

typedef int TYPE;

TYPE increase_one( TYPE var )
{
  return (TYPE)&((struct CharPair*)var)->second;
}

#include <stdio ...



......感慨一下, 看了3分钟, 才明白, whyglinux 请让我再崇拜下

利用地址运算, 来实现 + 1....无敌了

论坛徽章:
0
37 [报告]
发表于 2006-12-22 16:04 |只看该作者
用地址计算在语言这里模糊了“加”,编译器翻译过去是会会用到加操作.这个方法用来计算结构成员的偏移很有用好象是在windows高级编程还是matt pike的书里面看到这么用的

论坛徽章:
0
38 [报告]
发表于 2006-12-22 16:46 |只看该作者
>> 用地址计算在语言这里模糊了“加”,编译器翻译过去是会会用到加操作

确实是这样的。但是我们只要保证了不在程序中使用 +、-、*、/、% 以及 ++、-- 等运算,就应该没有使用楼主所说的四则运算。至于编译器的实现,不是 C 程序本身能够控制的,应该不再讨论的范畴之内。

论坛徽章:
0
39 [报告]
发表于 2006-12-23 00:36 |只看该作者
查表算不算?
a[256]={1,2,3,...,255,0}
var=a[var]


这个太有意思了

论坛徽章:
0
40 [报告]
发表于 2006-12-23 11:12 |只看该作者
>> 查表算不算?

var=a[var] 中 a[var] 在 C 中相当于 *(a + var),你说算不算?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP