/**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;
}