黑马程序员技术交流社区

标题: 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