求助c语言编写一个字节位互换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助c语言编写一个字节位互换相关的知识,希望对你有一定的参考价值。

求助c语言编写一个字节位互换
一个字节内的八位互换,关键是位运算忘了,要全部程序,分数可以再加,3位和4位互换,2和5互换不是高低

题目很简单,但考察的是面试者的编程习惯和态度。今天闲来无事,多说几句。题目理解为高半字节和低半字节互换:

最好用宏定义 #define CHG_BYTE(bData) (((bData)<<4)+((bData)>>4))
注意,1、这种底层操作一般用宏可以增强程序的效率,避免不必要的函数调用开销;2、宏定义最好用大写;3、参数一定要用();4、参数前加个b说明书字节类型的,5、宏定义望文生 义,光看名称就知道用途。以上几点说明你有一个好习惯,会给面试官留下好印象。
或者用函数,也要注意函数的书写格式
BYTE ChgByte(BYTE bData)

return (bData<<4)+(bData>>4);


注意函数名大小写,对齐格式等。 另外BYTE这样定义:
typedef unsigned char BYTE;
这样可以增强程序在不同硬件平台的的可移植性。
面试官可能会问你<<的含义和有限级别等相关问题,请提前准备
参考技术A 怎么换?
右移>>
左移<<
位与&
位异或^
思路:0xf0位与,得到高位,<<4低位去高位,>>4高位去低位,再位或|得到新BYTE

void main()

unsigned char ch,ch1,ch2;
scanf("%c",&ch);
ch1 = (ch&0x08)>>1;
ch2 = (ch&0x04)<<1;
ch = (ch&0xf3)|(ch1&ch2);//3/4位ok
ch1 = (ch&0x02)<<3;
ch2 = (ch&0x10)>>3;
ch = (ch&0xed)|(ch1&ch2);//2/5位ok
printf("result:%c",ch);
return;

再修改一下,上面的不顺,位算符差了一个
void main()

unsigned int ch,ch1,ch2;
scanf("%d",&ch);
ch1 = (ch&0x08)>>1;
ch2 = (ch&0x04)<<1;
printf("input:%d\n",ch);
ch = (ch&0xf3)|(ch1|ch2);//3/4位ok
printf("step1:%d\n",ch);
ch1 = (ch&0x02)<<3;
ch2 = (ch&0x10)>>3;
ch = (ch&0xed)|(ch1|ch2);//2/5位ok
printf("result:%d\n",ch);
return;

输出测试:
24 //0b00011000
input:24
step1:20
result:6 //0b00000110追问

你们的答案都太迟了

参考技术B 这个效率比较高点
inline uint8_t rev(uint8_t x)

x = (x & 0x55) << 1 | (x >> 1) & 0x55;
x = (x & 0x33) << 2 | (x >> 2) & 0x33;
x = (x & 0x0F) << 4 | (x >> 4) & 0x0F;
return x;

或者
void main()

unsigned char tmp1,tmp2;

printf("please input a char: ");
scanf("%c", &tmp1);
tmp2=
((tmp1&0x01)<<7)
|((tmp1&0x02)<<5)
|((tmp1&0x04)<<3)
|((tmp1&0x08)<<1)
|((tmp1&0x10)>>1)
|((tmp1&0x20)>>3)
|((tmp1&0x40)>>5)
|((tmp1&0x80)>>7);
printf("converted char is: %c\n", tmp2);
return 0;

这个应该可以了吧
参考技术C 支持任意两位互换.

运行结果:
00000110 /* 输入数字, 23位是1 45位是0 */
00001010 /* 34互换后 */
00011000 /* 25也互换后 */

代码:

#include <stdio.h>
unsigned char mask(int n)

return 1 << (n-1);

void setbit(unsigned char *in, unsigned char n, unsigned char value)

if(value) (*in) |= mask(n);
else (*in) &= (~mask(n));

unsigned char getbit(unsigned char in, unsigned char n)

unsigned char value = in & mask(n);
if(value) return 1;
else return 0;

void swap(unsigned char *in, int m, int n)

unsigned char valuem = getbit(*in, m);
unsigned char valuen = getbit(*in, n);
setbit(in, n, valuem);
setbit(in, m, valuen);


void showbin(unsigned char x)

int i;
for(i=8;i>=1;i--)
printf("%d", getbit(x, i));

printf("\n");

int main()

/* 3位是1,, 2位是1, 4位是0, 5位是0. */
unsigned char a = mask(3) | mask(2);

showbin(a);

/* 34互换 */
swap(&a, 3, 4);
showbin(a);

/* 25互换 */
swap(&a, 2, 5);
showbin(a);

return 0;
追问

你们的答案都太迟了

参考技术D 比如你要第二位和第三位互换,用00000010和00000100按位与把2,3位提取出来保存,保存的字节再用移位二位的移到3位,3位的移到二位,再把原字节和11111001相与,把2,3位变为了0,再跟前面提取并移位后的两个结果相异或就得到结果了
~取非,&按位与,|按位或,异或用(~a&b)|(~b&a)

C语言程序求助!

#include "stdio.h"
main()
int num_list[]=6,7,8,9,k,j,b,u=0,m=4,w;
w=m-1;
while(u<=w)

j=num_list[u];
k=2;
b=1;
while(k<=j/2&&b)
++k;b=j%k;

if(b)
printf("%d\n",num_list[u]); u++;
else

num_list[u]=num_list[w];
num_list[w]=j; w--;




请问这个程序是如何输出的?

首先看无论while怎么循环k都等于2,b都等于1.
程序开始:w=3进入最外层while循环,j=6,k=2,b=1;
在进入内层循环k<=6/2也就是2<=3为真,逻辑与上b也就是1,结果为真。
k自增为3,b=j%k也就是b=6%3 =0
在进入内层while循环,结果为假,跳过内层循环,进入判断语句。
由于b=0为假,所以执行else,数组list[]=9,7,8,6. w=2.
第2次外循环:
进入外层while. u<=w 也就是0<=2为真
j=9,k=2,b=1.
进入内层循环,k<=j/2&&b 也就是 2<=9/2&&1 结果为真
k自增为3,b=j%k 也就是b=0 在进入内层while结果为假,进入判断语句
此时数组list=8,7,9,6 w自减为1
第3次外循环:
进入外循环判断 0<=1为真
j=8,k=2,b=1 进入内循环while 2<=8/2&&1 为真
k自增为3,b=8%3 b为2,在进入内循环while 3<=4&&2 为真
k自增为4 b=8%4 =0 在进入内循环while 为假---------------------------------注意这里内循环了2次喔!
进入判断语句 此时list=7,8,9,6 w=0
第4次外循环:
进入外判断while 0<=0 为真
j=7,k=2,b=1 进入内循环while 2<=7/2&&1 结果为真。
k自增为3 b=7%3 =1 进入内循环while 3<=3&&1
k自增为4 b为3 内循环为假
进入if语句
输入始终u=0的数组下表=7
是不是这样的?为啥我测试当w为0时,内循环只有1次呢?
参考技术A 为什么有这么纠结的程序,我无聊一个个的数往里面代入..输出是7,
一个个的代的试嘛! 整个大循环运行四次结束,
w=3

u=0;w=3
j=6;
k=2;
b=1;
k=2; 3 b=1;
k=3;b=0;
list[0]=9;
list[3]=6;w=2

u=0.w=2
j=9
k=2
b=1
k=2.4.b=1
3.0. 这里面是小while里的程序
list[0]=8
list[2]=9.w=1

u=0.w=1
j=8
k=2
b=1
k=2.4.b=1
3.2
3.4.2
4.0.
list[0]=7
list[1]=8.w=0

u=0.w=0
j=7
k=2
b=1
k=2.3.b=1
3.1
3.3.1
4.3
k=4.j/2=3.b=3
这里4<3不成立,b=3为真,,,,开始执行if语句了
list[0]=7,u=1 w=0
再u<=w
所以输出了7,程序终止了!~追问

小while里的怎么看不懂,这是怎么运行的,你能耐心的教我吗?
k=2.4.b=1
3.0. 里面小while里程序
list[0]=8
list[2]=9.w=1

本回答被提问者和网友采纳
参考技术B 你这个程序没有输出,因为“b=j%k”始终为0,无法进入"if(b)"语句,因此你在W自减4次后就程序跳出“while(u<=w)”循环,没有结果输出。追问

可是软件运行出来的答案和标准答案是相同的,结果为7,我是不太理解

追答

结果应该会输出 8 和7 把,之前的说法错误。
第一步:u=0,w=3 得到b=6%3=0,无法进入“if(b)” 所以num_list[]={9 ,7,8,6};

第二步:u=0,w=2 得到b=9%3=0,一样无法进入“if(b)" 所以num_list[]=8,7,9,6;
第三步:u=0,w=1 得到b=8%3=2,进入”if(b)" 所以输出num_list[u]=num_list[0]=8; u=1;num_list[]=8,7,9,6;
第四步:u=1,w=1 得到b=8%3=2,进入”if(b)" 所以输出num_list[u]=num_list[1]=7;u=2;num_list[]=8,7,9,6;
第五步:while(2<=1) 不成立。

追问

结果应该是7,

以上是关于求助c语言编写一个字节位互换的主要内容,如果未能解决你的问题,请参考以下文章

C语言高低位互换操作

怎样用c++编程进行高低位互换?

C语言 对字节的高位和低位进行互换!

C语言之linux内核实现位数高低位互换

编写一个C语言的内存拷贝函数,把源地址的指定长度的数据拷贝到目标地址,考虑8,16,32位数据位宽

C语言试题二十七之请编写程序,实现矩阵(3行3列)的转置(即行列互换)。