代码中注释很清楚,应该可以看的很明白
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
int a = 3; //0011
int b = 15; //1111
int c = 4; //0100
int d = -1;
int result = 0; //0000
printf("int-->%lu \n", sizeof(int));
//按位与 相同位的数字都为1 则是1 否则为0
result = a & b;
printf("按位与-->%i \n", result);
//按位或 只要有一个为1 就为1
result = b | c;
printf("按位或-->%i \n", result);
//按位异或 不同为1 相同位0,即执行加法即可,只是不需要进位
result = a ^ c;
printf("按位异或-->%i \n", result);
//按位取反 这个好理解,0换为1 1换为0即可
result = ~a;
printf("按位取反-->%i \n", result);
//此时输出为-4,这里详细说明一下
//数字在内存中是以补码的形式存储的,求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1
/*
a = 3 = 0000 0000 0000 0000 0000 0000 0000 0011 int四个字节
1111 1111 1111 1111 1111 1111 1111 1100 这是一个负数,机器会认为是以补码方式存储
由于负数的补码是其对应正数二进制表示的所有位取反+1,则其对应的正数为:
先减去1 1111 1111 1111 1111 1111 1111 1111 1011
再取反 0000 0000 0000 0000 0000 0000 0000 0100 = 4 因为它是负数 所以 输出为 -4
则此时可知 -(a + 1) == ~a 其中a > 0
按照内存中是按补码存储的,负数取反自己算。
*/
//左移 按位向左移,超出的舍弃,新出现的空位补0
result = d << 3;
printf("左移-->%i \n", result);
//右移 低位移出舍弃,高位正数补0 负数补1
result = d >> 2;
printf("右移-->%i \n", result);
return 0;
}
输出
int-->4
按位与-->3
按位或-->15
按位异或-->7
按位取反-->-4
左移-->-8
右移-->-1
Program ended with exit code: 0