------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一个字节中通常包括8个位,从左到右为7~0
在字节中7为高位,0为低位
128 64 32 16 8 4 2 1
一个字节可以存储的范围为0-255的整数
unsigned char 表示 0 -255
signed char 表示 -128 - +127
二进制以0和1为基准,以1数值的位数进行平方运算
八进制一个简便的理解方法为,每个八进制数对应一个3位的二进制
八进制唯一不方便的地方是3位的八进制需要用9位的二进制表示
十六进制9以上用ABCDEF表示10到15,每个十六进制位对应于一个4位的二进制数。
位运算
1.二进制取反码或按位取反~
unsigned char a = 10;
unsigned char b = ~a;
printf("A: %d B: %d\n",a,b);
A: 10 B: 245
~符号将0 1 互换2.位与&
unsigned char a = 9;
unsigned char b = 6;
b &= a;
printf("A: %d B: %d\n",a,b);
A: 9 B: 0
&符号,只有两个数位值都为真才为1,而真是用1表示,所以可以理解为同位1=1才为1,代码中9&6二进制为1001&0110,由于没有为真的数位,所以是0000,结果也是0
3.位或|
unsigned char a = 9;
unsigned char b = 6;
b |= a;
printf("A: %d B: %d\n",a,b);
A: 9 B: 15
|符号,看起来好像是执行了加法运算,实际是由于代码中9&6二进制为1001&0110,恰好出现对应的空缺而出现的结果
在|运算中,两数中一数位为真便是真,即有1就是1
4.位异或^ unsigned char a = 9;
unsigned char b = 6;
b ^= a;
printf("A: %d B: %d\n",a,b);
a ^= a;
printf("A: %d\n",a);
A: 9 B: 15
A: 0
^异或运算中,相等则为0,不相等为1,1001^1001 结果为0,而1001^0110则执行了|运算结果当然和之前的|代码一样是155.左移:<<
unsigned char a = 9;
unsigned char b;
b = a << 2;
printf("A: %d B: %d\n",a,b);
A: 9 B: 36
<<2运算表示将从低位补入两位0,并丢弃超位数的两位数,所以1001<<2,补入了两00,丢弃了两个00结果为100100,在根据二进制算法为,2^5 + 2^2 = 32 + 4 = 36
5.右移:>>
unsigned char a = 9;
unsigned char b;
b = a >> 2;
printf("A: %d B: %d\n",a,b);
A: 9 B: 2
>>2运算将丢弃低位两个数位,从高位补0,所以1001>>2结果为10
2^1 = 2
6.小结
char *itobs(int,char *);
void show_bstr(const char *);
int main(int argc, const char * argv[]) {
char bin_str[8* sizeof(int) + 1];
int number;
printf("Enter Number!");
while (scanf("%d",&number) == 1) {//由于只有一个%d,所以返回值是1
itobs(number, bin_str);
printf("%d is\n",number);
show_bstr(bin_str);
putchar('\n');
}
puts("Bye!");
return 0;
}
char *itobs(int n, char * ps)
{
int i;
static int size = 2 *sizeof(int);
for (i = size - 1; i >= 0; i--,n>>=1) {
ps[i] = (01 & n) + '0';//01&n 使用掩码01将取得n最低位是1还是0,但是字符串需要的是字符0或者1,所以加上‘0’即可满足ASCII码
}
ps[size] = '\0';
return ps;
}
void show_bstr(const char * str)
{
int i = 0;
while (str[i]) {
putchar(str[i]);
if (++i %4 == 0 && str[i]) {
putchar(' ');
}
}
}
上述代码为将一个整数以二进制的字符串输出,核心难点在于掩码01&n的使用,以及n>>=1
至于,i%4则是取模运算,每4位输出一个空格
void change(int num);
void changeChar(char );
int main(int argc, const char * argv[]) {
change(9);
printf("\n");
changeChar('a');
changeChar('A');
return 0;
}
void change(int num)
{
int i = (sizeof(int) << 3) -1;//移位运算符可以高效的执行对2的幂的乘法和除法
while (i >= 0) {
int k = num >> i & 1;//先移位再使用掩护码&来取值
printf("%d",k);
if (i%4 == 0) {
printf(" ");
}
i--;
}
}
void changeChar(char text)
{
printf("%c,%c\n",text,text^32);
}
0000 0000 0000 0000 0000 0000 0000 1001
a,A
A,a
上述代码展示了二进制输出以及字符大小写的转换