当前位置: 首页 > news >正文

上海网站建设网站游戏汕头网站排名推广

上海网站建设网站游戏,汕头网站排名推广,网站欣赏公司网站案例,淮安企业网站建设以下全部用c举例 int a[10] {0,1,2,3,4,5,6,7,8,9};我们想交换数组a中第5个和第6个的值#xff0c;通常想到的做法是创建一个中间变量作为中转#xff0c;如下#xff1a; #includestdio.hvoid swap2num(int a[], int i, int j) {int tmp a[i];a[i] a[j];a[j] …以下全部用c举例 int a[10] {0,1,2,3,4,5,6,7,8,9};我们想交换数组a中第5个和第6个的值通常想到的做法是创建一个中间变量作为中转如下 #includestdio.hvoid swap2num(int a[], int i, int j) {int tmp a[i];a[i] a[j];a[j] tmp; }int main() {int a[10] {0,1,2,3,4,5,6,7,8,9};printf(before swap:a4%d, a5%d\n, a[4], a[5]);swap2num(a, 4, 5);printf(after swap:a4%d, a5%d, a[4], a[5]);return 0; }有种略显高明的做法使用三次异或就可以实现同样的交换效果如下: #includestdio.hvoid swap2num(int a[], int i, int j) {a[i] a[i] ^ a[j];a[j] a[i] ^ a[j];a[i] a[i] ^ a[j]; }int main() {int a[10] {0,1,2,3,4,5,6,7,8,9};printf(before swap:a4%d, a5%d\n, a[4], a[5]);swap2num(a, 4, 5);printf(after swap:a4%d, a5%d, a[4], a[5]);return 0; }解读 先谈谈异或的规则 1相同为0相异为1 (2) 异或满足交换律即 a ^ b ^ c a ^ ( b ^ c) a ^ c ^ b (3) N ^ N 0, N ^ 0 N; 那么假设 a[i] 甲 a[j] 乙, 则第一次执行完 “a[i] a[i] ^ a[j];”后 a[i] 甲 ^ 乙; a[j] 乙; 执行完 “a[j] a[i] ^ a[j];” 后 a[i] 甲 ^ 乙; a[j] 甲 ^ 乙 ^ 乙; 根据异或规则得到 a[j] 甲 ^ (乙 ^ 乙) 甲 ^ 0 甲 a[i] 甲 ^ 乙; 再次执行完 “a[i] a[i] ^ a[j];” 后 a[i] 甲 ^ 乙 ^ 甲 乙 a[j] 甲 至此a[i]和a[j]完成交换 深度解读 异或操作又叫做 “无进位相加“即相加的两个数的各个位相加但不产生进位 然后我们从信息的角度再来审视一下代码发现这其实是信息的叠加和分离在这种思想下我们可以用普通的加法也可以实现交换当然是在不产生进位溢出的情况下进位溢出意味着信息的丢失 (乘除也可以的,在乘积没有溢出的情况下) #includestdio.hvoid swap2num(int a[], int i, int j) {//本函数的局限性--和不能产生进位溢出所以这只是为了举例说明现实中可不能这样写a[i] a[i] a[j]; // 以和的形式将两个数字叠加在一起信息的叠加a[j] a[i] - a[j]; //和减去其中一个必然得到另一个信息的分离a[i] a[i] - a[j]; //和减去其中一个必然得到另一个信息的分离 }int main() {int a[10] { 0,1,2,3,4,5,6,7,8,9 };printf(before swap:a4%d, a5%d\n, a[4], a[5]);swap2num(a, 4, 5);printf(after swap:a4%d, a5%d, a[4], a[5]);return 0; }同理上面的异或交换也是信息的叠加和分离但它的操作不产生进位也就不会有溢出导致的信息丢失问题 但是 这个异或交换有个巨大的隐患即 i 和 j不能相等 即不能让数组中相同位置的数进行交换会发生什么问题呢 记得上面的异或规则吗 N ^ N 0,任意数和自己异或都等于0 所以经历了异或交换以后a[i] 0, a[j] 5, 完蛋了没交换成功反而还让其中一个等于0了 当然可以略作修改做个判断如下 #includestdio.hvoid swap2num(int a[], int i, int j) {if (i j)return; //i等于j即同一个位置交换时直接返回a[i] a[i] ^ a[j];a[j] a[i] ^ a[j];a[i] a[i] ^ a[j]; }int main() {int a[10] { 0,1,2,3,4,5,6,7,8,9 };printf(before swap:a4%d, a5%d\n, a[4], a[5]);swap2num(a, 4, 4);printf(after swap:a4%d, a5%d, a[4], a[5]);return 0; }plus: linux源码中swap的实现方法它就是用新建一个变量中转的方式实现的交换 #define swap(a, b) \ do { typeof(a) __tmp (a); (a) (b); (b) __tmp; } while (0)
http://www.zqtcl.cn/news/742284/

相关文章:

  • 开创集团网站建设如何在学校网站上做链接
  • 上海优秀网站设计百度投诉中心人工电话号码
  • 卖建材的网站有哪些跨境电商工具类产品的网站
  • 做毕业网站的周记网站开发项目书
  • 门户网站价格仿站工具下载后咋做网站
  • 国外优秀ui设计网站常州网站建设电话
  • 大连手机网站建设做外贸无网站如何做
  • 做旅游门票网站需要什么材料人工智能培训机构哪个好
  • 免费的网站程序个人网站可以做论坛么
  • ps中网站页面做多大的wordpress cdn 阿里
  • 深圳整站创意设计方法有哪些
  • 浙江做网站多少钱江门市网站开发
  • 保定建站价格dw软件免费安装
  • 在建设部网站上的举报凡科网怎么建网站
  • wordpress做小说网站工作期间员工花钱做的网站
  • 婚介网站方案小说网站架构
  • 英文在线购物网站建设湖北建设厅举报网站
  • 漯河网络推广哪家好宁波网站seo公司
  • 网站设计ppt案例做物流用哪个网站好
  • 做网站官网需多少钱天元建设集团有限公司财务分析
  • 一般网站建设用什么语言网络规划设计师历年考点
  • 做网站卖菜刀需要什么手续江苏网站优化
  • 花生壳内网穿透网站如何做seo优化鞍山58同城网
  • 怎么为一个网站做外链跨境电商app
  • 医疗网站不备案seo技巧课程
  • 网页和网站有什么区别湖南省郴州市邮编
  • 公考在哪个网站上做试题武威做网站的公司
  • 河南如何做网站常州网站建设价位
  • 昆山网站建设培训班成都百度
  • 兰山网站建设郑州最好的网站建设