一. 按位取反
//~:按位取反,如果是负数,则是对其补码取反. 因为负数在内存中就是以补码的形式存在的
void anWeiQuFan(void) {
int a = 2;
printf("%d\n", ~a);// -3
//2: 0000 0010
//~:按位取反,得 1111 1101, 1111 1101是负数, 负数应该用补码存储, 得反码1000 0010, +1得补码1000 0011, 得 -3
int b = -3;
printf("%d\n", ~b);//2 -3在内存中按人脑想象应该是111,但是存储的是补码是101,取反得010,也就是2
int c = -2;
printf("%d\n", ~c);//1 -2在内存的补码是:110 ~得001 1
int d = -1;
printf("%d\n", ~d);//0 -1在内存的补码是:111 ~得000 0
}
int main(int argc, const char * argv[]) {
anWeiQuFan();
}
二. 与符号(按位与&)
int main(int argc, const char * argv[]) {
//判断一个数是奇数还是偶数
//奇数的二进制最后一位永远是1, 偶数的二进制最后一位永远是0
//所以,用这个数 & 1,如果为1则奇数, 为0则偶数
//&1其实就是&0000 0001, 不管那个数前面为几,&00000都是0,所以只看最后一位即可
printf("%d\n", 11&1);// 1
printf("%d\n", 10&1);// 0
}
三. 或符号(|)
四. 异或符号(^)
相同为0, 不同为1
//
// main.c
// cdemo
//
// Created by liyongkai on 2021/6/6.
//
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char * argv[]) {
/*
3 0000 0011
5 ^0000 0101
6 0000 0110
*/
printf("%d\n", 3^5); //结果为6
printf("%d\n", 5^6); //结果为3
printf("%d\n", 3^6); //结果为5
//可得 a ^ b ^ b = a
int a = 3;
int b = 5;
//交换两个数
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d b=%d\n", a, b);//a=5 b=3
}
五. 右移符号(>>)
- 对于无符号整数,左移右移在所有系统的结果都是一样的。
- 对于有符号证书(负数), 右移在不同的系统上结果可能是不一样的,需要注意
网友评论