#include<stdio.h>
#include<stdlib.h>
-------------------&与------------------------
//任意输入int类型数据,打印内存的二进制储存
void mainA()
{
//int类型占4个字节,四个字节32位
int num;
scanf_s("%d", &num);
printf("\nnum=%d,&num=%p\n", num, &num);
int data = 1 << 31;
//构建一个相与的数据,1左移31,1前面填充31个0
//如果要求源码,需要加一个步骤
if (num < 0)
{
num = ~num + 1;//求源码 ~是取反码 源码=反码取反再+1
num=num|data;//设置符号位
}
for (int i = 1; i <= 32; i++)
{
if ((num&data) == 0)
{
putchar('0');
}
else
{
putchar('1');
}
num <<= 1;
if (i % 4 == 0)
{
printf(" ");
}
}
system("pause");
}
//&可以清零某些指定位数
------------------|或-----------------------
//xxxx xxxx x代表灯泡,前四个不变,后四个打开 就要用|
//0000 1111 位操作或,可以打开指定位的灯泡,其他不变
void main1()
{
unsigned char ch = 255;//1111 1111
unsigned char ch1 = 245;//1111 0000
unsigned char ch2 = 15;//0000 1111
ch = ch&ch1;//1111 0000
printf("%d\n", ch);//245
ch = ch | ch2;//1111 1111
printf("%d", ch);//255
system("pause");
}
---------------^异或----------------------
//异或 相同得0 不同得1
void main2()
{
//交换变量的三种方法,不提供中间变量
int a = 100;
int b = 10;
//有溢出风险的两周方法:
a = a + b;
b = a - b;
a = a - b;
a = a*b;
b = a / b;
a = a / b;
//用为操作来交换,不会溢出或者越界
int x = 9;//0000 1001
int y = 3;//0000 0011
x = x^y; //0000 1010 10
y = y^x; //0000 1001 9
x = x^y; //0000 0011 3
}
---------------左移和右移---------------------
void main3()
{
//一个二进制位 最大1 1
//两个二进制位 最大11 3
//三个 111 7
//不考虑符号位的情况下,有n位,最大就是2的n次方-1
unsigned char ch1 = 1; //0000 0001 1
unsigned char ch2 = ~ch1; //1111 1110 254
}
void main()
{
unsigned int num = 1;
for (int i = 0; i < 31; i++)
{
num <<= 1;//左移约等于不断地*2,右移约等于不断的/2
//例如0001左移变成0010再左移0100
printf("%u\n", num);
}
system("pause");
}
与,或,异或 学习
最新推荐文章于 2023-02-27 18:19:47 发布