黑马程序员技术交流社区
标题: 2014.11.4学习小结之位运算 [打印本页]
作者: 736010695 时间: 2014-11-4 23:26
标题: 2014.11.4学习小结之位运算
/*
位运算的六种运算方法:1、按位与 2、按位或 3、按位异或 4、按位取反 5、左移 6、右移
*/
#include <stdio.h>
int main()
{
//按位与:对应的两个二进位都为1时,结果才为1,否则为0
//符号是“&”
/*
1001
0101
----
0001
所以9 & 5的二位制值是0001,转换册成十进制结果是1
*/
printf("%d\n", 9 & 5);
//按位或:对应的两个二进位只要一个为1时,结果为1,否则为0
//符号是“|”
/*
1001
0101
----
1101
所以9 | 5的二位制值是1101,转换册成十进制结果是13
*/
printf("%d\n", 9 | 5);
//按位异或:当对应的两个二进位不相同时,结果为1,否则为0
//符号是“^”
/*
1001
0101
----
1100
所以9 ^ 5的二位制值是1100,转换册成十进制结果是12
1、相同数值异或自己结果肯定为0
2、多个数值进行异或时顺序可以交换但结果一样,例如:9^5^7==7^9^5
3、任何数值和零异或结果还是原来的值
*/
printf("%d\n", 9 ^ 5);
printf("%d\n", 9 ^ 9);
printf("%d\n", 9 ^ 0);
printf("%d\n", 9 ^ 6 ^ 3);
printf("%d\n", 3 ^ 9 ^ 6);
//按位取反:对应二进位取反,包括符号位
//符号是“~"
/*
0000 0000 0000 0000 0000 0000 0000 1001
1111 1111 1111 1111 1111 1111 1111 0110
所以~9的结果是”1111 1111 1111 1111 1111 1111 1111 0110“翻译成二进制结果是-10
*/
printf("%d\n", ~9);
/*
左移:a<<n
把整数a的各位二进制位全部向左移动n位,高位丢弃,低位补0,其实就是乘以2的n次方
由于左移是丢弃最高位,0补最地位,所以符号位也会被丢弃,左移出来的结果可能会改变正负性
0000 0000 0000 0000 0000 0000 0000 1001
00 0000 0000 0000 0000 0000 0000 100100
所以9 << 2的结果是”00 0000 0000 0000 0000 0000 0000 100100 “翻译成二进制结果是36
9<<1 结果是9*2的1次方
9<<2 结果是9*2的2次方
9<<n 结果是9*2的n次方
*/
printf("%d\n", 9<<2);
/*
右移:a>>n
把整数a的各位二进制位全部向右移动n位,符号位保持不变,其实就是除以2的n次方
为正数时符号是0,高位补0,多出的低位删除
为负数时最高位是1,空出的高位补0还是补1取决于编译器系统的规定(一般情况符号位是几就用几补)
0000 0000 0000 0000 0000 0000 0000 1000
000000 0000 0000 0000 0000 0000 0000 10
所以8 << 2的结果是"000000 0000 0000 0000 0000 0000 0000 10"翻译成二进制结果是36
8<<1 结果是8*2的1次方
8<<2 结果是8*2的2次方
8<<n 结果是8*2的n次方
*/
printf("%d\n", 8>>2);
return 0;
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |