C语言笔记17

142 阅读2分钟

位操作

进制转换

原理见程序设计基础笔记1
用函数实现十进制转二进制

void printBinary(unsigned char dec)//无符号char整型
{
    //数组初始化为0
    char bits[8] = {0};
    int count = 0;
    int quotient;
    int remainder;
    while(dec > 0)
    {
        remainder = dec % 2;
        quotient = dec / 2;
        dec = quotient;
        bits[count] = remainder;
        count++;
    }
    //逆序输出所有二进制位
    for (int i =8 -1; i >=0; i--)
        printf("%d", bits[i]);
    putchar('\n');
}

逻辑运算符

与&& 3&&5运算结果为真 用1表示
或|| 3||0运算结果为真 用1表示
非!3!运算结构为假 用0表示

位运算符

深入运算对象内部 把运算对象内部的二进制位 根据0或1 看作真或假 再进行逻辑运算
与&
或|
异或^
非~ 一元运算符

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void printBinary(unsigned char dec)
{
    //数组初始化为0
    char bits[8] = { 0 };
    int count = 0;
    int quotient;
    int remainder;
    while (dec > 0)
    {
        remainder = dec % 2;
        quotient = dec / 2;
        dec = quotient;
        bits[count] = remainder;
        count++;
    }
    //逆序输出所有二进制位
    for (int i = 8 - 1; i >= 0; i--)
        printf("%d", bits[i]);
    putchar('\n');
}

int main()
{
    //170是10101010 102是01100110
    
    //与
    printf("%hhu\n", 170 & 102);//34
    printBinary(170 & 102);//00100010

    //或
    printf("%hhu\n", 170 | 102);//238
    printBinary(170 | 102);//11101110

    //异或
    printf("%hhu\n", 170 ^ 102);//204
    printBinary(170 ^ 102);//11001100

    //非
    printf("%hhu\n", ~ 170);//85
    printBinary(~ 170);//01010101

    return 0;
}

左移右移

左移<<

把数据对象内部的二进制全部向左移动指定位 空出来的位置用0填充

printBinary(231);//11100111
printBinary(231 <<1);//11001110
printBinary(231<< 2);//10011100
printBinary(231 <<3);//00111000

右移>>

把数据对象内部的二进制全部向右移动指定位 对于无符号类型 空出来的位置用0填充 对于有符号类型,空出来的位置用O或1填充取决于编译器

printBinary(231);//11100111
printBinary(231 >>1);//01110011
printBinary(231 >>2);/00111001
printBinary(231 >>3);//00011100