C语言位运算,代码看不懂,求解释

#include<stdio.h>
void main()
{
unsigned a,b,c,d;
scanf("%o",&a);
b=a>>4;
c=~(~0<<4);
d=b&c;
printf("%o\n%o\n",a,d);
}
看不懂啊,就拿一个数(a)带进去详细说一下每一步的运算过程吧。

第1个回答  推荐于2016-03-17
先介绍一下位运算的法则:
1. >>是按位右移运算符,无符号数右移一位相当于该数除以2。移位时,移出的位数全部丢弃。对于无符号数,则高位补0;对于有符号数,则符号位补0还是1,不确定。
2. <<是按位左移运算符,无符号数左移一位相当于该数乘以2。移位时,移出的高位全部丢弃,低位全补0。
3. ~是按位取反运算符,用来对一个二进制数按位取反。即将0变1,1变0。
4. &是按位与运算符,参加运算的两个数据,按位进行与运算。如果两个相应的位都为1,则该位为1,否则为0。
5. |是按位或运算符,参加运算的两个数据,按位进行或运算。如果两个相应的位至少有一个为1,则该位为1,否则为0。
6. ^是按位异或运算符,若两个相应的位同号,则该位为0,不同则为1。
然后就你这个实际问题解答:
假设输入的a是4,对应的8位就是00000100,b是a右移4位,变成了00000000,也就是0,c的值比较麻烦,首先是把0取反,结果是全1,即11111111(此处与C编译器的位数有关,16位编译器和32位编译器结果是不同的,不过不影响最终结果),然后左移4位,变为11110000,再取反,得到00001111,也就是十进制的15,d等于b和c进行按位与,也就是00000000跟00001111按位与,结果是00000000,也就是全0,所以最终打印结果(注意是以8进制形式打印),a是原来输入的4,d是0本回答被提问者采纳

c语言的位运算疑惑
2:ASCII编码表中 32表示的是空格符号。 char中寸的是ASCII编码,所以是32 3:位移运算:>>表示右移位 我以8为例。8的二进制是1000, 8>>1对应的二进制形式就是1000——0100看到变化了没有。所以右移位相当于这个数除2 左移位你看看 01000——10000是16了。相当扩大一倍。32的二进制是 0010...

C语言中位运算求八进制数的补码下面是程序但是看不懂
unsigned short是2个字节,也就是16位 scanf("%o",&a);在命令行窗口输入8进制数保存给变量a 0100000的二进制形式为最高位为1,其余为0,也就是说与其与运算之后,结果的二进制最高位为1则a为负数,下面的判断就是分为正负数两种情况 if(z==0100000)\/*如果a小于0*\/ z=~a+1;\/*取反加1*\/...

C语言——位运算
按位与运算符“&”进行位的逻辑与操作。按位或运算符“|”进行位的逻辑或操作。按位异或运算符“^”进行位的逻辑异或操作。对于无符号数,左移1位相当于乘2,左移2位相当于乘4。左移运算速度快,某些C编译系统会自动使用左移实现乘法。取反运算对负数有特殊意义。例如,无符号数a=18(二进制0001...

怎样学好c语言,那些符号什么的看不懂啊
C语言的关键之少,运算符多。运算符有算术运算、位运算、逻辑运算等,有单目、双目、三目运算,有优先级之分。加上C语法的灵活性,同样的代码在不同编译器上的解释都可能不一样,就是老程序员也未必能弄清楚。优先级 运算符 名称或含义 使用形式 结合方向 说明 1 []数组下标 数组名[常量表达式]...

c语言位运算
C语言中的位运算符用于操作二进制位。这些运算符直接对整数的二进制位进行操作,是低级语言操作的重要组成部分。它们对于优化程序性能、实现特定功能非常关键。具体的位运算符 1. 位移运算符:这两个运算符用于将二进制位向左或向右移动指定的位数。例如,`x << 2`表示将x的二进制表示向左移动两位,...

c语言位运算问题?
c语言位运算问题解答:要解答这个问题我们先来看一个例子,代码如下图一,图中右边是问题中得到代码,左边是这段代码的汇编指令。两种情况的不同点详细说明如下:第一种情况:printf("%d",2>>64);由图中的汇编代码可以看出,如果两个数都是常数的情况下,代码中是不含对应的汇编指令的,因为编译器...

C语言,,求解释啊~~
m = (n++) + 1是n+1后赋值给m,然后再加1 m = 1 + (++n);是n+1后再加1 后赋值给m 10=1010;12=1100;10&12是1010与1100等于1000=8 10^12是1010异或1100等于0110=6

0基础学习C语言第三章:位运算
在C语言的学习过程中,位运算是一种非常重要的操作。它提供了六种基本位运算符,分别是:按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)和右移(>>)。下面,我们将深入探讨这些运算符的原理和应用。首先,我们来看按位与运算。按位与运算符"&"用于参与运算的两个数的对应二进位...

C语言——位运算
C语言中,位运算是一种独特且强大的功能,它直接作用于二进制位级,对数据进行操作。位运算符包括按位取反(~)、左移(<>)、按位与(&)、按位或(|)和按位异或(^)。以下是这些运算符的简介和示例:1. 按位取反(~):单目运算符,将运算数所有位取反,如无符号字符a=18,~a的结果...

C语言中位运算符问题 这句话怎么解释啊
对于有符号数,最高位为符号位,>> 右移运算,移动的时候符号位会被同时移动。比如有符号数的-8,如果用8位二进制补码表示,就是二进制的 1111 1000,右移0位,也就是不移动,等于-8,就等于8除以1,也就是8除以2的0次方;右移1位:如果补1进来, 1111 1100 ,等于-4, 就等于8除以2...

相似回答