明解C语言 7-6例题分析

/**C语言中常见 ~Number ,怎么计算?
计算一个数字的 ~number
比如说现在有 A=60
所谓~,就是我们要找到那个负数的补码值等于这个数字的取反。
那么A 的8位二进制数 就是 0011 1100
那首先要计算 ~A 即 ~60 , 那么先取反
即 1100 0011 。
因为 负数的补码是 取反+1。
所以此处逆向操作需要 -1 取反
即 1100 0011 -1 == 1100 0010 (第一步逆向操作)
1100 0010 =>取反=> 00111101 => 十进制的 61
最后结果 A == 60 , ~A = -61
C 语言中 ~60 == -61
计算~0
0 的补码
0000 0000
取反 1111 1111
逆操作 -1 => 1111 1110
取反 => 0000 0001
即 1
又因此处 是取反 负数 即 ~0 == -1
任意数
B=x
~B= x二进制 =>取反 => 减1 => 再取反 => 转化为 10 进制的负数
*/

/**按位运算*/


#include <stdio.h>
#include <stdlib.h>

int count_bits(unsigned x);
int int_bits(void);
void print_bits(unsigned x);


/**定义函数count_bits,输入无符号整数,进入while循环,循环内容是按位与,所有数据进行按位与
1进行与运算,每执行一次,X向右移1位。当结果为真变量bits进行加1,并将数据返回,返回整数X中设置的位数*/


int count_bits(unsigned x)
{
    int bits = 0;
    while(x)
    {
        if(x & 1U) bits++;
        x >>= 1;
    }

    return bits;
}

/**定义函数int_bits该函数调用函数count_bits,并赋值(~0U);(~0U)是将0进行取反,目的是获得unsigned型
数据的位数,其中0取反就是1,32位全是1,最终获得unsigned型数据的位数是32位,其中一个数据的取反公式~B= x二进制 =>取反 => 减1。
*/


int int_bits(void)
{
    int n = 0;
    n = count_bits(~0U);
    printf("是unsigned型%d位\n",n);
    return n;

}

/**定义函数print_bits,该函数将输入的数据进行二进制的输出
定义int变量i将获取unsigned型的数据位数,将X的二进制的数据的每一位与1执行与运算并进行三目运算运算结果
如果为1就输出1否则输出0;其中i=int_bits() - 1 的目的是去除符号位。

*/
void print_bits(unsigned x)
{
    int i;
    for(i=int_bits() - 1;i >= 0; i--)
        putchar(((x >> i) & 1U) ? '1':'0');

}

int main(void)
{
    unsigned a,b;

    puts("请输入两个非负整数");
    printf("a:");     scanf("%u",&a);
    printf("b:");     scanf("%u",&b);

    printf("\n a      =");  print_bits(a);
    printf("\n b      =");  print_bits(b);

    printf("\n a&b    =");  print_bits(a & b);
    printf("\n a!b    =");  print_bits(a | b);
    printf("\n a^b    =");  print_bits(a ^ b);
    printf("\n ~a     =");  print_bits( ~ a);
    printf("\n ~b     =");  print_bits( ~ b);

    putchar('\n');

    return 0;
}
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值