//打印二进制
void printf_bin(int num);
int main() {
/*****位运算*****/
//位移运算符
unsigned char bits = 0233; //10011011
bits << 8; //提升为int,向左移8位 00000000 00000000 10011011 00000000
bits << 31; //超出边界丢弃 10000000 00000000 00000000 00000000
std::cout<<(bits >> 3)<<std::endl; //向右移3位,超出边界舍去 00000000 0000000 00000000 00010011
std::cout << typeid(bits >> 3).name()<<std::endl; //int类型
//位求反运算符
printf_bin(~bits); //11111111 1111111 1111111 01100100
std::cout << (~bits) << std::endl; //-156
//位与&、位或|、位异或^
printf_bin(bits & ~bits); //32个0
printf_bin(bits | ~bits); //32个1
printf_bin(bits ^ bits); //32个0
printf_bin(bits ^ ~bits); //32个1
}
//打印二进制
void printf_bin(int num)
{
int i, j, k;
unsigned char* p = (unsigned char*)&num + 3;//p先指向num后面第3个字节的地址,即num的最高位字节地址
for (i = 0; i < 4; i++) //依次处理4个字节(32位)
{
j = *(p - i); //取每个字节的首地址,从高位字节到低位字节,即p p-1 p-2 p-3地址处
for (int k = 7; k >= 0; k--) //处理每个字节的8个位,注意字节内部的二进制数是按照人的习惯存储!
{
if (j & (1 << k))//1左移k位,与单前的字节内容j进行或运算,如k=7时,00000000&10000000=0 ->该字节的最高位为0
printf("1");
else
printf("0");
}
printf(" ");//每8位加个空格,方便查看
}
printf("\r\n");
}
打印数据二进制格式的方法参考自:C语言打印数据的二进制格式-原理解析与编程实现_c语言打印二进制-CSDN博客