有关位操作的C语言编程问题

题目是对16种不同项目投票,分别用16位中的1个位表示,编写函数,头部如下:
short majority(short a,short b,short c)
{
... ...
这个函数接受3个人的输入,分别存于a,b,c中,函数返回的整数的各个位表示投票结果,如果某个项目3个人中有2个人以上同意,对应位置为1,否则为0
下面是我编写的程序:

当运行程序时输入 15 11 4 正确的结果应该为15, 我的运行结果是-2,不知道哪出问题了,求大侠解答...

#include <limits.h>
short majority(short,short,short);
int main(void)
{
short a,b,c,d;
scanf("%hd",&a);//*** short int格式化输入输出 d 加前缀 h 否则,32位以上系统中有越界行为
scanf("%hd",&b);
scanf("%hd",&c);
d=majority(a,b,c);
printf("%hd\n",d);
return 0;
}
short majority(short a,short b,short c)
{
int i;
short p,q,v,r = 0;
short n = sizeof(short)*CHAR_BIT;
short mask = 1<<(n-1); //*** 减号的优先级低于移位操作符,要用括号,才得到得掩码0x8000
for(i=1;i<=n;i++)
{
r<<=1; //***** <<<< 放到这里 关键所在
p=((a&mask)==0 ? 0 : 1 ); //*** 不要引号 要0和1 不是'0'和'1'
a<<=1;
q=((b&mask)==0 ? 0 : 1 );
b<<=1;
v=((c&mask)==0 ? 0 : 1 );
c<<=1;
r|=((p+q+v)>=2 ? 1 : 0 );
//r<<=1; //***** <<<放在这里是算法错误 放到循环开始处,最初的0多移一回没关系,当前结果不应当位移,只对上一循环结果移位!!
}
return r;
}
温馨提示:内容为网友见解,仅供参考
无其他回答

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

有关C语言位操作的问题: 1&0=0要怎么理解。。符号&不懂
&是位与,与之相似的有逻辑与&& 两个操作数进行位与操作时,先把操作数化成二进制数,然后每一位进行与操作,当对应的位同时为1时,结果为1,否则为0,题目是1&0,两个操作数都很简单,不用化成二进制数都知道答案,因为前面的位都是0,最后的位,一个为1,一个为0,所以结果为0,另举一例...

C语言 位运算
C语言中的位运算提供了一种高效的处理二进制数据的方法。首先,我们有取反操作,0取反变成1,1取反则变成0。对于位左移(<<),比如1<<n,意味着将1向左移动n位,相当于数值乘以2的n次方。右移(>>)与左移类似,数值除以2的n次方。接着是按位与(&),当1与任意数结合时,结果保持原数,0...

C语言 什么叫位操作
位操作就是将数值转换成2进制如:10(1010),然后进行计算,如:10^6=(1010)^(0110)=(0010)即为2

C语言位操作
state&0x8000是按位进行与操作,与操作就是把两个数都转化为二进制数,然后对应位依次进行比较,如果对应位都为1,那么与操作结果就是1,如果没有对应位都为1的情况,那么与操作结果就是0。0x8000是十六进制数,转换成二进制就是1000 0000 0000 0000,然后与state的值按位进行与操作。这里如果state...

c语言bit操作问题
C语言支持位操作,示例如下:\/* 要操作的字节变量为i *\/ unsigned char i;i = i & 0x7f; \/* 把最高位置0,其余位不变 *\/ i = i | 0x80; \/* 把最高位置1,其余位不变 *\/ i = i & 0xbf; \/* 把第二位置0,其余位不变 *\/ i = i | 0x40; \/* 把第二位置1,其余位不...

c语言位运算左位移问题。
不对吧,左移应该是整体向左边移动,如y=x<<2,就是x的左边去掉2位,后边补2个0,结果应该是:01001100

c语言位运算
在位运算中,常常会遇到需要结合多个位运算的情况。例如,在编程中可能需要检查一个整数的特定位是否被设置。通过组合使用这些位运算符,可以有效地执行这些操作。另外,由于直接操作二进制位,位运算在处理系统底层问题或优化代码时特别有用。总结 掌握C语言中的位运算对于深入理解计算机底层操作和编写高效...

C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左移1位...
1、右移,除以2右移n位除以2的n次方;右移的概念和左移相反,就是往右边挪动若干位,运算符是>>;右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:inti=0x80000000;i=i>>1;\/\/i的值不会变成0x40000000,而会变成0xc0000000 2、左移,乘以2...

《C语言要点》第七章 位操作——位运算和位域
在C语言中使用位图可以节省存储空间。位图使用位来标记元素的值,因此在处理大量数据时,其效率和空间利用都有优势。要设置位图中某个位置为1,可以使用位运算符。以`int`类型为例,通常长度为4个字节,使用`SHIFT`和`MASK`来计算具体位的位置。例如,要设置位序号为`i`的位为1,可以使用`a[i>>...

相似回答