进制表示:
// 1.默认就是10进制
int num = ;
// 2.在前面加上一个0就代表八进制
int num1 = ;
// %d是以十进制的方式输出一个整数
printf("%d\n", num1);
// %o是以八进制的方式输出一个整数
printf("%o\n", num);
// 在数值前面加上0b就代表二进制
int num2 = 0b1100;
printf("%d\n", num2);
// 在数值前面加上0x就代表十六进制
int num3 = 0xc;
printf("%d\n", num3);
// %x是以十六进制的方式输出一个整数
printf("%x\n", num);
进制转换:
二进制 --> 十进制
1 2 4 8 …
二进制 --> 八进制
三位二进制表示一位八进制
二进制 --> 十六进制
四位二进制表示一位十六进制
原码 反码 补码:
/*
12的二进制
12在内存中存储的是它的补码
00000000 00000000 00000000 00001100
正数的特点:(三码合一) 正数的原码就是TA的反码就是TA的补码
-12
二进制的最高位我们称之为符号位
如果符号位是0代表是一个正数,
如果符号位是1代表是一个负数
10000000 00000000 00000000 00001100 (-12的原码)
11111111 11111111 11111111 11110011(反码, 符号位不变其它位取反)
11111111 11111111 11111111 11110011
+00000000 00000000 00000000 00000001
_____________________________________________
11111111 11111111 11111111 11110100(补码 , 反码+1) 结论:无论正数负数在内存中存储的都是补码 11111111 11111111 11111111 11110101 (补码)
-00000000 00000000 00000000 00000001 (-1)
_____________________________________________
11111111 11111111 11111111 11110100 (反码)
10000000 00000000 00000000 00001011 (原码)
*/
位运算规律:
& 按位与
特点:只有对应的两位都是1才返回1 否则返回0
规律:任何数按位与上1结果还是那个数
| 按位或
特点:只要对应的两位其中一位是1就返回1
口诀:一真则真
^ 按位异或
特点:对应的两位不相同返回1 相同返回0
多个整数按位异或的结果和顺序无关
int result2 = 9 ^ 5 ^ 6;
int result2 = 9 ^ 6 ^ 5;
相同整数按位异或结果是0
int result3 = 9 ^ 9;
任何整数按位异或上0结果不变
int result4 = 9 ^ 0 ;
任何整数按位异或上另一个整数两次结果还是那个数
int result5 = 9 ^ 9 ^ 5;
int result6 = 9 ^ 5 ^ 9;
~ 按位取反
特点: 0变1 1变0
<< 左移
a << n 把整数a的二进制位往左边移n位
移出的位砍掉,低位补0, 发现左移会把原有的数值变大
左移的应用场景:当要计算某个数乘以2的n次方的时候就用左移,效率最高
注意点:左移有可能改变数值的正负性
>> 右移
a >> n 把整数a的二进制位往右边移n位
移出的位砍掉, 缺少的以为最高位是0就补0是1就补1(是在当前操作系统下)
右移的应用场景:当要计算某个数除以2的N次方的时候就用右移,效率最高
位运算练习:
#include <stdio.h>
void printBinay(int value); int main(int argc, const char * argv[]) {
/*
要求定义一个函数, 传入一个整数, 输出该整数的二进制
%i %o %x
0000 0000 0000 0000 0000 0000 0000 1001
&0000 0000 0000 0000 0000 0000 0000 0001
// 1.让9的二进制向右移31, 就可以获取到9得最高位的二进制, 然后让9的二进制的最高位和1相&, 那么就可以获得9的最高位
// 2.让9的二进制向右移30, 就可以获得9二进制的第二位
// 3.以此类推, 直到0位置 技巧:
1.任何数与1相&都是那个数
2.利用位移取出每一位
*/
int num = ;
printBinay(num);
return ;
} void printBinay(int value)
{
// 1.定义变量需要向右移动的位数
int offset = ;
// 2.通过循环取出每一位
while (offset >=) {
int result = (value >> offset) & ;
printf("%i", result);
// 3.每次取出一位就让控制右移的变量-1
offset--;
if ((offset+) % == ) {
printf(" ");
}
}
printf("\n");
}