C语言位操作问题,请高手解答

限定只能用这些运算符的条件下 =! ~ & ^ | + << >>
写两个个函数
1. isAsciiDigit(int x) = 1(if 0x30 <= x <= 0x39,其他值返回0)
2. conditional(2,4,5) = 4 (和x?y:z一样)
不好意思两位 是不是我没有说清楚,只能用这些运算符, if是绝对不能用的 连逻辑运算都不行,就是要用底层的东西来表达我们常用的逻辑判断...所以才有点难度,这是Carnegie Mellon的计算机经典本科课程的第一次作业...

这两个问题需要从计算机的结构方面去考考虑。
1、
int isAsciiDigit(unsigned char x)
{
unsigned char L,H;
//先判断 x-0x30是否>0,是L=1,否L=0
L =x +( ~0x30 + 1);
L = !(0x80 & L); //负数则为0

//再判断 0x39-x是否>0,是H=1,否H=0
H = 0x39 + (~x +1);
H = !(0x80 & H); //负数则为0
return (H & L);
}
//如果x为16位数则0x80要相应的改为 0x8000,32位 0x80000000
2、
unsigned char conditional(unsigned char x,unsigned char y,unsigned char z)
{
unsigned char tmp;

tmp = !x;
tmp = ~tmp;
tmp = tmp + 1;
//上面这段,x>0则 tmp = 0x00,否则为 0xFF;
return ((~tmp & y) | (tmp & z));
}
//x也可以是16位,32位,抑或更多。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-09-01
供您参考

int isAsciiDigit(int x)
{
int y;
int z;
int w;
int t;

y=x & 0x20;
z=x & 0x10;
w=x & 0x08;
t=x & 0x06;
if(!y) {return 0;}
if(!z) {return 0;}
if(!w) {return 1;}
if(t) {return 0;}
return 1;
}

int condition(x,y,z)
{
if(x) return y;
return z;
}
第2个回答  2010-09-01
第一个很简单,只给出公式(函数体):
if(x&~0X39)
return(0);
else return(1);
第二个:
comditial(int a,int b,int c)
{if(a)return(b);else return(c);
}

C语言的位运算问题,请高手指教
0xF7 对应的2进制应该是11110111 temp=0xF7 temp=temp<<1 如果你的temp是一个8位的数,移位后为11101110,即0xEE 如果你的temp是一个8位以上的数,移位后为111101110,即0x1EE

C语言问题,求大神解决,谢谢啦,我是小白,最好能够解释下原因..
第二项和第四项结果等同都是指向指针的指针操作。可以将二维数组看成一个双重指针,第一个中括号是一个一重指针。比如说a[n][m]中a[0]是一个指向a[0][m]数组首位a[0][0]的指针,而a则是指向指针数组*a[n]的首位a[0]的指针。这样我们来看B选项,*(a+2)表示一个指向a[2][0]的指针...

c语言的问题~~请高手帮忙解答~~
1 比如输出9.2 : %10.2e 里的 10.2表示 整数位不足10位时前面补空格,小数部分不到2位时末尾添0 . 但因为有个 e,所以用科学计数输出 结果应该为 9.20e+000 否则 %10.2f的话就是 9.20 2 比如输出10 : 按八进制 10= 8 + 2就应该是 12, 输出 12 3 比如输出10 : a 4 比如...

c语言编程问题,求高手解答(高分)
你的程序没有大的问题,可以执行,只是以下几个小问题:一、第一行包含的文件不存在,这一行应该删除。二、定义了argc、argv两个变量没有使用,编译会有警告,可以删除他们或者不管,最好改为:int main()三、scanf输入n和k的时候,中间有个逗号分隔,这样输入的时候会麻烦,最好改为:scanf("%d%d...

请教C语言高手为小弟解答的疑惑
1,int* pN=&N;pN是一个指针,这个指针指向N,指针的值是存放数据N的内存的首地址;2,int* pN=N;pN也是一个指针,指针的值是就是N;这种用法是不合适的,因为你一般不知道这个指针指向的内存内容是什么。如果真要用的话,可以写成这样:int* pN=(int*)N。3,int* pIndex=nArray;这种写法...

C语言菜鸟求高手解答...
1. 第一个问题似乎是一个关于C语言条件判断的疑问。你需要明确表达你的问题,以便得到具体的解答。2. 在C语言中,`m++` 表示先使用变量 `m` 的值,然后将 `m` 的值加1。所以,表达式 `m++ > 5` 首先将 `m` 的值(初始为5)用于比较,然后 `m` 自增。3. 由于 `m` 的初始值是5,...

求C语言高手解答
c是比较智能的,当他明确知道一个表达式的值时,剩下的式子不会再进行运算。比如&&运算,当两个值其中一个为0时,他就是0了,第二个式子就不用运算,由于a=5,b=6 (m=a>b)相当于(m=5>6)所以,m=0所以表达式(m=0)的值为0 所以(m=a>b)&&(n=c>d)的值就是0 所以n=c>d没有运算...

c语言问题,高手请进谢谢!!!
即i+i--->这两个i些时都是3;而不是一个2,一个3;4。再一个++i 此时i加1得到i,i=3+1=4;由上面的理解知道i此时已经是4,5、由上面四步得到一个i=4,i+i+i的式子,写入数据得到12 今天上课还在纠结这个问题,一看到你的问题突然想起来了!呵呵 ...

一些C语言题目!求高手答疑!谢谢了!!!
int a,b,c;如果这样 c=a,b;,c是a,如果是这样c=(a,b),c就是b 所以(x--,--y)是4 而x++是输出printf后再执行的,所以是2 5,(!x || y--),!x说明第一个是假了,x才是真,所以会判断下一个,y=1,所以或表达式中有一个语句是true,即整个表达式的逻辑值为true,所以你输出的...

c语言上机问题 高手请进
看你是用TC还是VC,把软件安装上了就可以进行编辑了,还有就是可以找一些VC的书来看下,学习如何上机倒是很容易的,TC会更简单一些.在这边很难讲明白,如何能找身边已经懂的人教一下,那会更快上手的.希望你能取得进步.用F10键就可以操作菜单了

相似回答
大家正在搜