黑马程序员-c语言位操作以及进制

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一个字节中通常包括8个位,从左到右为7~0

在字节中7为高位,0为低位

128 64 32 16 8 4 2 1

一个字节可以存储的范围为0-255的整数

unsigned char 表示 0 -255

signed char 表示 -128 - +127

二进制以0和1为基准,以1数值的位数进行平方运算

八进制一个简便的理解方法为,每个八进制数对应一个3位的二进制

八进制唯一不方便的地方是3位的八进制需要用9位的二进制表示

十六进制9以上用ABCDEF表示10到15,每个十六进制位对应于一个4位的二进制数。


位运算

1.二进制取反码或按位取反~

    unsigned char a = 10;
    unsigned char b = ~a;
    printf("A: %d B: %d\n",a,b);

A: 10 B: 245

~符号将0 1 互换

2.位与&

    unsigned char a = 9;
    unsigned char b = 6;
    b &= a;
    printf("A: %d B: %d\n",a,b);

A: 9 B: 0

&符号,只有两个数位值都为真才为1,而真是用1表示,所以可以理解为同位1=1才为1,代码中9&6二进制为1001&0110,由于没有为真的数位,所以是0000,结果也是0

3.位或|

    unsigned char a = 9;
    unsigned char b = 6;
    b |= a;
    printf("A: %d B: %d\n",a,b);

A: 9 B: 15

|符号,看起来好像是执行了加法运算,实际是由于代码中9&6二进制为1001&0110,恰好出现对应的空缺而出现的结果

在|运算中,两数中一数位为真便是真,即有1就是1

4.位异或^

    unsigned char a = 9;
    unsigned char b = 6;
    b ^= a;
    printf("A: %d B: %d\n",a,b);
    a ^= a;
    printf("A: %d\n",a);

A: 9 B: 15

A: 0

^异或运算中,相等则为0,不相等为1,1001^1001 结果为0,而1001^0110则执行了|运算结果当然和之前的|代码一样是15

5.左移:<<

    unsigned char a = 9;
    unsigned char b;
    b = a << 2;
    printf("A: %d B: %d\n",a,b);

A: 9 B: 36

<<2运算表示将从低位补入两位0,并丢弃超位数的两位数,所以1001<<2,补入了两00,丢弃了两个00

结果为100100,在根据二进制算法为,2^5 + 2^2 = 32 + 4 = 36

5.右移:>>

    unsigned char a = 9;
    unsigned char b;
    b = a >> 2;
    printf("A: %d B: %d\n",a,b);

A: 9 B: 2

>>2运算将丢弃低位两个数位,从高位补0,所以1001>>2

结果为10

2^1 = 2

6.小结


char *itobs(int,char *);
void show_bstr(const char *);
int main(int argc, const char * argv[]) {
    char bin_str[8* sizeof(int) + 1];
    int number;
    printf("Enter Number!");
    while (scanf("%d",&number) == 1) {//由于只有一个%d,所以返回值是1
        itobs(number, bin_str);
        printf("%d is\n",number);
        show_bstr(bin_str);
        putchar('\n');
    }
    puts("Bye!");
    return 0;
}
char *itobs(int n, char * ps)
{
    int i;
    static int size = 2 *sizeof(int);
    for (i = size - 1; i >= 0; i--,n>>=1) {
        ps[i] = (01 & n) + '0';//01&n 使用掩码01将取得n最低位是1还是0,但是字符串需要的是字符0或者1,所以加上‘0’即可满足ASCII码
    }
    ps[size] = '\0';
    return ps;
}

void show_bstr(const char * str)
{
    int i = 0;
    while (str[i]) {
        putchar(str[i]);
        if (++i %4 == 0 && str[i]) {
            putchar(' ');
        }
    }
}

上述代码为将一个整数以二进制的字符串输出,核心难点在于掩码01&n的使用,以及n>>=1

至于,i%4则是取模运算,每4位输出一个空格

void change(int num);
void changeChar(char );
int main(int argc, const char * argv[]) {
    change(9);
    printf("\n");
    changeChar('a');
    changeChar('A');

    return 0;
}
void change(int num)
{
    int i = (sizeof(int) << 3) -1;//移位运算符可以高效的执行对2的幂的乘法和除法
    while (i >= 0) {
        int k = num >> i & 1;//先移位再使用掩护码&来取值
        printf("%d",k);
        if (i%4 == 0) {
            printf(" ");
        }
        i--;
    }
}
void changeChar(char text)
{
    printf("%c,%c\n",text,text^32);
}

0000 0000 0000 0000 0000 0000 0000 1001 

a,A

A,a

上述代码展示了二进制输出以及字符大小写的转换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值