/* 位运算的六种运算方法: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;
}
|