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
声明:除已注明的引用外,文章系作者原创,引用转载请注明出处,如有必要请联系作者