ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C语言位运算:深入了解移位操作符与位操作符

C语言位运算:深入了解移位操作符与位操作符 移位操作符与位操作符按位或|、按位与和按位取反~、按位异或^、移位运算、一样所有位运算的操作对象都是计算机中存储的补码形式的二进制数。大家请先弄清楚二进制的原码 反码 补码 再来学习位操作符1.移位操作符:左移操作符右移操作符移位操作符的操作数只能为整数左移操作符移位规则“左边抛弃右边补零”移位操作符针对的是二进制数并且是用补码计算的符号位0的二进制原 反 补码相同#includestdio.hintmain(){intnum10;intnnum1;printf(n%d\n,n);printf(num%d\n,num);return0;}num10的二进制补码00000000 00000000 00000000 000001010num1的二进制原码00000000 00000000 00000000 00010100左边抛弃 右边补零打印结果右移操作符移位规则1.逻辑右移左边用0填充右边丢弃2.算数右移左边用原值的符号补充右边丢弃#includestdio.hintmain(){intnum-1;intnnum1;printf(n%d\n,n);printf(num%d\n,num);return0;}逻辑右移num-1的二进制补码111111111 11111111 11111111 111111111num1 2147483647的二进制补码011111111 11111111 11111111 111111111左边用0填充右边丢弃num1 2147483647的二进制原码011111111 11111111 11111111 111111111算数右移num-1的二进制补码111111111 11111111 11111111 111111111num -1的二进制补码111111111 11111111 11111111 111111111左边用原值的符号补充右边丢弃num -1的二进制原码10000000 00000000 00000000 000000001打印结果本人所用的编译器是vs2022,在这个编译器中’ 默认的是算数右移但是大多数编译器用的都是算术右移对于移位运算符不要移动负数位这个是标准未定义的*。2.位操作符、|、^、~位操作符都是用补码计算的计算机中无论正数、负数存储和参与位运算的都是补码运算完成后结果会再从补码转回十进制供我们读取。位操作符有 按位与 同时为1则为1相异为0| 按位或 : 只要有1就为1同时为0才为0^ 按位异或 相同为0相异为1~ 按位取反 符号位不变其他全部取反同样它们的操作数必须是整数同时为1则为1相异为0#includestdio.hintmain(){inti2;intn3;printf(%d\n,in);return0;}逻辑分析i2 补码:00000000 00000000 00000000 000000010n3补码:00000000 00000000 00000000 000000011in原码:00000000 00000000 00000000 000000010(同时为1才为1只要有0就为0|只要有1就为1同时为0才为0#includestdio.hintmain(){inti2;intn3;printf(%d,i|n);return0;}逻辑分析i2补码:00000000 00000000 00000000 000000010n3补码:00000000 00000000 00000000 000000011i | n原码:00000000000000000000000000000110(只要有1就为1同时为0才为0^相同为0相异为1#includestdio.hintmain(){inti3;intn5;printf(%d\n,i^n);return0;}逻辑分析i3 :00000000 00000000 00000000 000000011n5:00000000 00000000 00000000 000000101i ^ n00000000 00000000 00000000 000000111(相同为0相异为1~符号位也变全部取反#includestdio.hintmain(){inti1;i~i;printf(%d\n,i);return0;}逻辑分析以 1 为例计算以 32 位整数为例数字 1 的 32 位二进制补码00000000 00000000 00000000 00000001按位取反后11111111 11111111 11111111 11111110这是结果的补码补码转十进制负数补码转原码规则先取反再加 1取反00000000 00000000 00000000 00000001加 100000000 00000000 00000000 00000010对应十进制 2加上负号最终结果为 -2。
返回列表