1.计算机中的进制
常见的进制:
1)十进制 0、1、2、3、4、5、6、7、8、9 逢十进一。
2)二进制 0、1 逢二进一。书写形式:需要以0b或0B开头,比如0b101。
3)八进制 0、1、2、3、4、5、6、7 逢八进一。书写形式:前面加个0,比如045。
4)十六进制 0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f 逢十六进一。书写形式:在前面加个0x或者0X,比如0x45。
例:定义一个10进制数,打印出对应的10、8、16进制数。
#include <stdio.h>
int main(int argc, const char * argv[]) {
int a = 13;
printf("%d\n",a);
printf("%o\n",a);
printf("%x\n",a);
return 0;
}
原码:一个数的绝对值的二进制表示,如果是正数,符号位(最高位)为0;如果是负数,符号位改为1。
反码:正数的反码等于它的原码。负数的的反码:除符号位不变,其他位逐位取反。
补码:正数的补码等于它的原码。负数的补码为其反码+1。
注意:
1)一个正数的原码、反码、补码都一样。
2)数据在计算机内部是以补码的形式存储的。
位运算:用于整数的二进制位之间的运算
& 按位与:如果两个数进行&操作,同1则1,有0则0:
9 & 4
00001001
&00000100
————————————————
00000000
实用技能:要获取一个数的最低位,让这个数和1进行按位&操作。
| 按位或:如果两个数进行&操作,有1则1,同0则0:
9 | 4
00001001
|00000100
————————————————
00001101
~ 按位取反:1变0,0变1
~9
00001001
~
————————————————
11110110
^ 按位异或:相同为0,不同为1
9 ^ 4
00001001
^00000100
————————————————
00001101
>>右移:各二进制位全部右移n位,低位丢弃,高位补符号位。
一个数右移n位,值等于原值除以2^n
右移位不会改变一个数的正负性。
用途:快速计算一个数除以2的n次方。
<<左移:各二进制位全部左移n位,高位丢弃,低位补0
记忆技巧:向左移动n位,相当于原数*2^n
注意:左移可能会改变一个数的正负性
9 << 2
00001001
<<2
————————————————
00110100
1)编程实现10进制转2进制
#include <stdio.h>
// 10进制转2进制
void changeTo2(int num){
// 获取长度
int len = sizeof(num) * 8;
int temp; // 定义变量,存储num移位后的值
int t; // 定义变量,存储num移位后和1进行按位与操作的结果
// 进制转换
for (int i = 0; i < len; i ++) {
temp = num >> (len - 1 - i); // 右移位
// 移位后和1进行按位与操作
t = temp & 1;
// 打印结果
printf("%d",t);
}
}
int main(int argc, const char * argv[]) {
changeTo2(63);
return 0;
}
#include <stdio.h>
void jiOuXing(int n){
// n和1进行按位与运算
if (n & 1) {
// 结果为1,则是奇数
printf("是奇数");
} else {
// 结果为0,则是偶数
printf("是偶数");
}
}
int main(int argc, const char * argv[]) {
jiOuXing(5);
return 0;
}