小甲鱼 发表于 2013-2-1 23:36:36

一道有意思的C语言试题

题目:

void inplace_swap(int *x, int *y)
{
      *y = *x ^ *y;
      *x = *x ^ *y;
      *y = *x ^ *y;
}

void reverse_array(int a[], int count)
{
      int first, last;
      
      for( first=0, last=count-1; first <= last; first++, last-- )
      {
                inplace_swap(&a, &a);
      }
}

以上代码段的作用是将数组a的元素头尾两端依次对调,那么有如下问题:

1. 解释下inplace_swap()利用异或能实现两数交换的原理?

2. 当数组中包含数字1,2,3,4时,代码可以正常运行,得到4,3,2,1。但如果数组中包含1,2,3,4,5时,你会发现结果是5,4,0,2,1。请问中间的0是从何而来的?

3. 对reverse_array的代码做哪些简单改动就能消除题目2存在的问题呢?


详细答案(回复可见):

**** Hidden Message *****

Sen1993 发表于 2013-2-1 23:50:51

跟看那个不用第三个数交换一样神奇

小明上广州 发表于 2013-2-2 00:02:48

对答案啦!!!!!!!!

下一站在哪里 发表于 2013-2-2 00:12:27

谢谢小甲鱼老师

联盟军工作室 发表于 2013-2-2 00:17:17

A 二进制运算 B 感觉是因为数组奇偶性的问题 C 加多个判断~~~~感性认知 看下答案~~~

hsw 发表于 2013-2-2 02:16:17

B:是因为下标为2 时 x,y指向的内存是同一个,当执行第一条*y = *x ^ *y; 时,*x ^ *y = 0;将0赋值给*y那么*x的值也会被改变

CHINA_无影 发表于 2013-2-2 09:27:57

1.利用了二进制运算(在零基础入门学习C语言64视频里有的)
2.因为 first==last 的时候,内存指向同一地址,*y = *x ^ *y就会等于0,相同的数异或都为0
3.修改first <= last为first < last就OK。void inplace_swap(int *x, int *y)
{
      *y = *x ^ *y;
      *x = *x ^ *y;
      *y = *x ^ *y;
}

void reverse_array(int a[], int count)
{
      int first, last;
      
      for( first=0, last=count-1; first < last; first++, last-- )
      {
                inplace_swap(&a, &a);
      }
}

506076894 发表于 2013-2-2 09:42:58

膜拜了,学习中

小游戏 发表于 2013-2-2 10:36:41

看下答案:dizzy:

nextforever 发表于 2013-2-2 15:53:48

这个要看

刘金伟 发表于 2013-2-2 15:57:14

好东西!!

花開丶若相惜ソ 发表于 2013-2-2 16:48:01

3跟3自己异或。。坑啊。:L

七月之变 发表于 2013-2-4 21:27:10

看下答案啊

g3mk 发表于 2013-2-4 21:36:18

对答案哈哈

缘缘 发表于 2013-2-7 12:09:16

看看看看~~~~~

ゃ莼处狼性ぉ 发表于 2013-2-7 12:41:38

开的就是结果暗暗啊啊

杞人 发表于 2013-2-7 18:19:38

一道有意思的C语言试题

野蛮酋长 发表于 2013-2-11 08:28:00

1、能完成两个数的交换保证了不会出现越界的问题
2、相同的两个数之间的异或得到的数是零   
3、在13行加判断因为所给数列有序所以只要判数是否相等就可以了
if (a==a)
continue;

943566987 发表于 2013-2-15 13:51:50

学习         

565123 发表于 2013-2-25 23:58:51

看答案啦
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 一道有意思的C语言试题