C语言位操作问题

只可以用! ~ & ^ | + << >>这些位操作符,不可以用if等语句 进行这几个小问题的编译

1.byteSwap(int x, int y, int z)
Examples: byteSwap(0x12345678, 1, 3) = 0x56341278

byteSwap(0xDEADBEEF, 0, 2) = 0xDEEFBEAD
这个函数交换第m和第n个byte上的数字

2 logicalShitf(int x,int y)

.Examples: logicalShift(0x87654321,4) = 0x08765432
C中位移运算貌似是算术位移,这里要求进行逻辑位移

3.unsigned float_neg(unsigned uf)
求float数的负数 这道题可以用逻辑判断和if while

函数原型必须做修改.
另外
!

+
并不是位操作符,确定可以使用么?

数组可以用宏来替换掉就是了,反正只有4个。
如果不能用宏,你可以自己手动把宏展开写入代码中

#include <stdio.h>

#define tab(x) (\\
x = x | (~((!(x^1))-1))&(8<<16),\\
x = x | (~((!(x^2))-1))&(16<<16),\\
x = x | (~((!(x^3))-1))&(24<<16),\\
x>>16)

int byteSwap(int x, int y, int z)
{
const long mask = 0xFF;
int ty = tab(y);
int tz = tab(z);
int yy = ( x >> ty ) & mask;
int zz = ( x >> tz ) & mask;
int tmp = ty;
tmp = tz;
tmp = ty;
tmp = tz;
x = x & ~( mask << ty ) | ( zz << ty );
x = x & ~( mask << tz ) | ( yy << tz );
return x;
}

int logicalShift(int x,int y)
{
return (int)(((unsigned)x)>>y);
}

float float_neg(float uf)
{
*((int*)&uf) = *((int*)&uf) ^ 0x80000000;
return uf;
}

void main ( void )
{
printf ( "%08X\
", byteSwap(0x12345678,1,3) );
printf ( "%08X\
", byteSwap(0xDEADBEEF,0,2) );
printf ( "%08X\
", logicalShift(0x87654321,4) );
printf ( "%f\
", float_neg(1.24f) );
printf ( "%f\
", float_neg(-6.489f) );
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-07-05
规定了小数的编码方式的话倒是可以手动做到这种效果,不过肯定比整数的位操作更难写……

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

C语言位运算符
C语言提供了六种位操作运算符,用于处理二进制位问题,主要应用于整型数据的处理。以下是这些运算符的详细介绍:C语言中的位运算包括按位与(&)、按位或(|)、异或(^)、取反(~)、左移(<<)和右移(>>)。这些运算符主要用于以下场景:按位与(&): 通过“与”运算清除某个位置的位。清零时,选择...

C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左移1位...
2、左移,乘以2左移n位乘以2的n次方;先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符。例如:inti=1;i=i<<2;\/\/把i里的值左移2位 左移就是:丢弃最高位,0补最低位

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

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

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

c语言位运算-3>>2,为什么是-1
-3的二进制表示为 1000 0011 符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.

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

C语言位运算题目
一、位运算符c语言提供了六种位运算符:&按位与 |按位或 ^按位异或 ~取反 <<左移 >>右移 1.按位与运算按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。例如:9&5可写算式...

C语言位运算符:与、或、异或、取反、左移和右移!
。6. **右移(>>)**:有符号右移,高位补符号位;无符号右移,高位补0。例如,113755(八进制)右移1位,结果取决于算术移位或逻辑移位。C语言中,位运算符还可以与赋值运算符一起使用,如a &= b,表示a与b按位与后赋值给a。学习这些位运算符能帮助程序员高效地处理二进制数据。

相似回答