进制表示:
// 1.默认就是10进制 int num = 12; // 2.在前面加上一个0就代表八进制 int num1 = 014; // %d是以十进制的方式输出一个整数 printf("%d ", num1); // %o是以八进制的方式输出一个整数 printf("%o ", num); // 在数值前面加上0b就代表二进制 int num2 = 0b1100; printf("%d ", num2); // 在数值前面加上0x就代表十六进制 int num3 = 0xc; printf("%d ", num3); // %x是以十六进制的方式输出一个整数 printf("%x ", 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 = 15; printBinay(num); return 0; } void printBinay(int value) { // 1.定义变量需要向右移动的位数 int offset = 31; // 2.通过循环取出每一位 while (offset >=0) { int result = (value >> offset) & 1; printf("%i", result); // 3.每次取出一位就让控制右移的变量-1 offset--; if ((offset+1) % 4 == 0) { printf(" "); } } printf(" "); }