从swap(a,b)谈起——编程中的小技巧(持续更新)

 

6. 用">>1"代替"/2"

能用移位进行的乘除(即乘除2的倍数)的情况,尽量使用算数移位操作<< 和 >>,

但是注意,java对于整数的四舍五入中,对于负浮点数并不是取“小于等于原值的最小整数值”,那是向下取整的定义,其机制更像是先按照正数的规则四舍五入,再加上负号,如下:

所以除了涉及负数(还是无法被相应2倍数整除的负数),和乘以相应的2的倍数以后溢出的整数,都可以用">>1"代替"/2"

 

/*  5. 不使用sizeof()运算符,计算各基本数据类型所占字节数

    在加减运算中,指针的值可以“认为”是一个整数。实际上,C语言规定,两个同型指针之差的返回值为int型,但是C语言不支持两只指针相加,报错:error C2110: cannot add two pointers。

Exercise

#include<stdio.h>

void main()
{
	double a[2];

	char *p1=(char *)a,*p2=(char *)(a+1);
	printf("p1的值为%p,p2的值为%p\n",p1,p2);      //%p 以16进制显示指针的值

	int length=p2-p1;
	printf("所占字节数为:%d\n",length);
}

    结果:

a的值为0018FF38,a+1的值为0018FF40         
p1的值为0018FF38,p2的值为0018FF40         //可以明显看出相差 40H-38H = 16-8(十进制) =8

所占字节数为:8 

  //  “在知道最短字节的数据类型(一般为char,1字节)的基础上,将位数更长的数据类型”

上面除了验证指针加整数后指针本身的值其实加 n*sizeof(类型) 外,也验证了两个指针之差返回值为int,另外,本例也提供了除用sizeof()运算符之外,利用指针特性自行计算各变量类型所占字节的新思路。当然,前提是知道char类型占1字节。

 

PS:C语言不支持两个指针相加的运算,会报错:error C2110: cannot add two pointers

*/

 

 

3. 将k位二进制数循环右移n位

     C/C++中只有左移<<和右移>>运算符,没有循环左移和循环右移打操作符(不像java等),如果现在要实现k位二进制数循环右移n位,怎么做效率最高呢。

    由2的知识当然知道可以将k位二进制数各位数字取出放进数组,循环右移后计算其值(位数在取出数字时已经知道)。

    但是这样的方法效率低下(取出数字并3次逆置),可以考虑使用C/C++C本来就支持的左移<<和右移>>运算符运算符。

如: 110  0101 101 循环右移三位

—>:  101 1100 101

右移3位:                        000 0101 101  (>>运算符默认高位补0)  (中间变量存储)

左移10-3=7位:              101 0000 000  (<<运算符默认低位补0)  (中间变量存储)

相加(或者逐位相或):101 0101 101                

    即通过<<,>>将“两部分”分别保存在相应位置,再相加/或,即可。因为<<,>>运算极快,所以这样的方法效率极高。

 

2.  将数组元素循环右移

    eg:1,2,3,4,5,6,7,8,9  循环右移三位

    —>:7,8,9,1,2,3,4,5,6

 

方法:

将1~6逆置:6,5,4,3,2,1,7,8,9

将7~9逆置:6,5,4,3,2,1,9,8,7

全部逆置:7,8,9,1,2,3,4,5,6

 

 

 

声明:除已注明的引用外,文章系作者原创,引用转载请注明出处,如有必要请联系作者

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值