c语言之位运算
2017-06-29 16:21
169 查看
位运算是针对二进制来操作的,位运算符有 &、|、~、^、<<、>>
&按位与 ,简单一句话 按位与运算就是把一个二进制数变0;因为 1 & 1 结果是 1 其他情况 1&0 、0 &1 、 0& 0 都是 0
| 按位或,简单一句话就是将二进制数变1 ;因为 0 | 0 结果是0 其他情况 1 | 1、1|0、0|1 都是1
~按位取反更简单,~1 结果是 0 ;~0 结果是 1;
^按位异或的结果是 相同是 1 相异是0 ;1^1、0^0结果是 1;0^1、1^0结果是0
<<左移,后面跟左移多少位;左移的结果是高位舍弃,低位补0
>>右移,后面跟右移跟多少位,右移的结果是低位舍弃,高位根据符号位补,正数补0,负数补1
来解释下面这个例子:
int mNumA = 34;
int mNumB = 31;
mNumA = mNumA^mNumB;
mNumB = mNumB^mNumA;
mNumA = mNumA^mNumB;
printf("%d %d\n", mNumA, mNumB);
不产生第三个变量交换两个数,我们知道了对于计算机来说一切皆是010101无穷无尽的二进制;那么这二进制就可以做很多事。利用异或的特性,假如:
101001
111000
结果是 101110 这是第一次异或的结果;再拿 101110与111000异或的结果是 101001 就还原了
为啥会这样? 因为异或就是 1异或1两次还是1 0异或两次还是0中间变了一次1 这利用了二进制位运算一一对应的关系,可以进行异或加密等
下面这例子是判断奇偶数的好方法:
srand((unsigned)time(0));
int nNumD = rand();
if (nNumD&1==1)
{
printf("这是一个奇数%d\n", nNumD);
}
else{
printf("这是一个偶数%d\n", nNumD);
}
因为计算机cpu只认识010101,所以如果用%2来判断也可以实现,但是直接用二进制数进行操作,cpu就可以少跑很多次,编程和高级的应用技巧就在这里。
骚年们不管是不断积累经验,还是真正理解计算机的本质,结合编程语言的特性,打开脑洞进行一些应用,而不是简单从正常的逻辑思维解决问题。学习一点是一点!
int nNumX = 10001;
int nNumY = 9211;
int nNumZ = (nNumX + nNumY) >> 1;
printf("%d\n", nNumZ);
上面这个例子是求两个数的平均数,平均数的关键在/2;而二进制是啥?是满2进1啊,也就是无论是个数是什么数,右移一位就是/2 这是逆向思维,
其实这个十进制的计算一样一样的,只不过我们不习惯二进制而已。那么可以推出正整数<<是*2;>>1是/2;也可以推出左移多少位就是*2的n次方;而右移多少位就是/2的n次方
4000
&按位与 ,简单一句话 按位与运算就是把一个二进制数变0;因为 1 & 1 结果是 1 其他情况 1&0 、0 &1 、 0& 0 都是 0
| 按位或,简单一句话就是将二进制数变1 ;因为 0 | 0 结果是0 其他情况 1 | 1、1|0、0|1 都是1
~按位取反更简单,~1 结果是 0 ;~0 结果是 1;
^按位异或的结果是 相同是 1 相异是0 ;1^1、0^0结果是 1;0^1、1^0结果是0
<<左移,后面跟左移多少位;左移的结果是高位舍弃,低位补0
>>右移,后面跟右移跟多少位,右移的结果是低位舍弃,高位根据符号位补,正数补0,负数补1
来解释下面这个例子:
int mNumA = 34;
int mNumB = 31;
mNumA = mNumA^mNumB;
mNumB = mNumB^mNumA;
mNumA = mNumA^mNumB;
printf("%d %d\n", mNumA, mNumB);
不产生第三个变量交换两个数,我们知道了对于计算机来说一切皆是010101无穷无尽的二进制;那么这二进制就可以做很多事。利用异或的特性,假如:
101001
111000
结果是 101110 这是第一次异或的结果;再拿 101110与111000异或的结果是 101001 就还原了
为啥会这样? 因为异或就是 1异或1两次还是1 0异或两次还是0中间变了一次1 这利用了二进制位运算一一对应的关系,可以进行异或加密等
下面这例子是判断奇偶数的好方法:
srand((unsigned)time(0));
int nNumD = rand();
if (nNumD&1==1)
{
printf("这是一个奇数%d\n", nNumD);
}
else{
printf("这是一个偶数%d\n", nNumD);
}
因为计算机cpu只认识010101,所以如果用%2来判断也可以实现,但是直接用二进制数进行操作,cpu就可以少跑很多次,编程和高级的应用技巧就在这里。
骚年们不管是不断积累经验,还是真正理解计算机的本质,结合编程语言的特性,打开脑洞进行一些应用,而不是简单从正常的逻辑思维解决问题。学习一点是一点!
int nNumX = 10001;
int nNumY = 9211;
int nNumZ = (nNumX + nNumY) >> 1;
printf("%d\n", nNumZ);
上面这个例子是求两个数的平均数,平均数的关键在/2;而二进制是啥?是满2进1啊,也就是无论是个数是什么数,右移一位就是/2 这是逆向思维,
其实这个十进制的计算一样一样的,只不过我们不习惯二进制而已。那么可以推出正整数<<是*2;>>1是/2;也可以推出左移多少位就是*2的n次方;而右移多少位就是/2的n次方
4000
相关文章推荐
- C语言中的基本数据类型--数据之间的混合运算
- 细数linux内核里那些偏门的C语言语法(一)简化三目运算
- 05、老徐教你学C语言基础篇4——C语言之门(运算篇)
- C语言中无符号数和有符号数之间的运算
- 《数据结构与算法分析-C语言描述》详解-Sec2(三)幂指数运算
- C语言自增自减运算
- C语言中各位运算的作用(与、或、异或等)
- C语言中位运算的一点小小总结
- a##b,在c语言中是什么运算?
- C语言之位运算
- C语言里的左移和右移运算
- NDK开发系列之第三课C语言的指针运算
- c语言练习题 4-2 矩阵运算
- C语言中&操作符可以进行哪些运算?
- C语言的位运算的优势
- 黑马程序员——C语言---七种运算
- 四则运算(C语言)
- 位运算02 - 零基础入门学习C语言65(完)
- C语言负数的移位运算
- c语言中算术运算优先级高于移位运算