进制转换和位运算

目录

进制转换

某进制转十进制

十进制负数转二进制负数

二进制负数,转对应的十进制

位运算

位运算符

 位运算符的运算规则

注意事项


进制转换

某进制转十进制

在C语言中,由其他进制数向十进制数转化可以通过如下方式来实现,而C语言中没有直接转为其他进制的函数,需要自行编写

int main()
{
	//0x558十进制输出  
	int n = 0x558;
	printf("%d", (int)n);
	return 0;
}

 C语言进制前缀:二进制 0b    八进制 0     十六进制  0x

十进制负数转二进制负数

    正数原码--原码取反--加1--得到的二进制就是负数的二进制
    -7的二进制:
    步骤:
    1.先求+7的二进制:0000 0111 原码
    2.反码:1111 1000
    3.补码:1111 1001
    -7的二进制为:1111 1001

二进制负数,转对应的十进制

已知二进制负数,求对应的十进制
    1.负的二进制
    2.二进制-1
    3.取反
    4.原码,将原码转成十进制,在十进制的前面添加负号

位运算

位运算符

运算符含义类型优先级结合性
~按位取反单目从右向左
<<,>>左移位,右移位双目从左向右
&按位与双目从左向右
^按位异或双目从左向右
|按位或双目从左向右

 位运算符的运算规则

 

aba&ba|ba^b~a
000001
010111
100110
111100

 (1)按位与

类似逻辑运算符中的&&,同时为真则为真,否则为假,可用于对某字节的某位清零

     0000 1111

 & 0000 0001

———————

    0000 0001

其中,15和1均以补码形式表示

int main()
{
    int n1 = 0b0110;//6
	int n2 = 0b0010;//2
    printf("%d\n", n1 & n2);//会进行十进制输出
    return 0;
}

运行结果:
2

(2)按位或

有一个为真则为真,否则为假,可用于对字节中的某位置1

     0000 1111

|     0111 1111

———————

      0111 1111

其中01111111时127的补码,所以15|127=127

int main()
{
    int n1 = 0b0110;//6
	int n2 = 0b0010;//2
    printf("%d\n", n1 | n2);
    return 0;
}

运行结果:
6

(3)按位异或 

二进制对应位相异时则为真,否则为假

      0000 0011

^    0000 0101

———————

      0000 0110

其中00000110是6的补码,所以3^5=6

int main()
{
    int n1 = 0b0110;//6
	int n2 = 0b0010;//2
    printf("%d\n", n1 ^ n2);
    return 0;
}

运行结果:
4

(4)按位取反 

各位取反,即0变1,1变0,符号位也会发生改变,得到的二进制数为补码,若为负数需要转化为原码再转化为十进制

~   0000 0101

———————

      1111 1010

其中,11111010是-6的补码,所以~5=-6,~5就是将5的二进制取反,之后负的二进制转为十进制

小结: ~a=-(a+1)     a为十进制

int main()
{
    int n1 = 0b0110;//6
	int n2 = 0b0010;//2
	printf("%d\n", ~n1);
	printf("%d\n", ~n2);
    return 0;
}

运行结果:
-7
-3

(5)左移位,右移位

<<左移位,右边空位自动补0

>>右移位,当x为有符号数时,左边空位补符号位上的值,称为算术移位;当x为无符号数时,左边空位补0,称为逻辑移位

注意:无论左移位还是右移位,从一端移走的位不移入另一端,移出的位的信息都丢失了

int main()
{
    int n = 12;//0000 1100 
	printf("%d\n", n << 1);//0001 1000   12*2
	printf("%d\n", n << 2);//0011 0000   12*2*2
	printf("%d\n", n << 3);//0110 0000   12*2*2*2
	printf("%d\n", n >> 2);//0000 0011   12/2/2
    return 0;
}

运行结果:
24
48
96
3
int main()
{
    int m = -15;//1111 0001
	printf("%d\n", m >> 1);//1111 1000    (-15)/2    无论正数还是负数,都是向下取整
	printf("%d\n", m >> 2);//1111 1100
    return 0;
}

运行结果:
-8
-4

注意事项

(1)位运算符是针对二进制执行的运算,但操作数不一定必须是二进制形式

int main()
{
    int m1 = 6;
	int m2 = 2;
    printf("%d\n", m1 & m2);
    return 0;
}

运行结果:
2

(2)不要将逻辑运算与位运算相混淆

 

int main()
{
	short x = 12, y = 8;
	printf("%5hd%5hd%5hd\n",!x, x || y, x && y);
	printf("%5hu%5hu%5hu\n",~x, x | y, x & y);
	printf("%5hd%5hd%5hd\n\n",~x, x | y, x & y);
	return 0;
}

运行结果:
    0    1    1
65523   12    8
  -13   12    8

(3)补充关于浮点数的一条内容:不要用==或!=测试两个浮点数是否相等,或者判断一个浮点数是否等于0 

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值