] 从键盘上输入一个无符号整数,判断其中第1位和第4位的二进制数字是否为1,应该怎样做?
#include <stdio.h>
int main(void)
{
unsigned int num;
int bit1, bit4;
printf("Enter an unsigned integer: ");
scanf("%u", &num);
bit1 = (num >> 31) & 1;
bit4 = (num >> 28) & 1;
if (bit1 && bit4)
{
printf("The first and fourth bits are 1\n");
}
else
{
printf("The first and fourth bits are not both 1\n");
}
return 0;
}
首先,使用 scanf()
函数从键盘上读取一个无符号整数。然后,我们可以按位检查第1位和第4位的二进制数字是否为1。对于第1位,我们可以向右移动31位(即对应于最高位的位数),然后通过 & 1
操作获取其值。对于第4位,我们可以向右移动28位(即对应于第4位的位数),然后通过 & 1
操作获取其值。最后,我们可以检查这两个位是否都为1,并按照结果输出相应的信息。
二叉树中序遍历的非递归算法的关键: 在中序遍历过某结点的整个左子树后,如何找到该结点的根以及右子树。
基本思想:
(1) 建立一个栈 (2)根结点进栈,遍历左子树 (3)根结点出栈,输出根结点,遍历右子树。
参考王卓老师p50,算法5.2:https://www.bilibili.com/video/BV1nJ411V7bd?p=90
栈的存储结构的建立
typedef struct{
int *base; //栈底指针
int *top; //栈顶指针
int stacksize; //栈可用最大容量
}SqStack;
SqStack S;
顺序栈的初始化操作:构造一个空栈
int InitStack(SqStack &S){ //构造一个空栈
S.base=new int[MAXSIZE]; //或S.base=(int*)malloc(MAXSIZE*sizeof(int));
if(!S.base) exit(FALSE); //存储分配失败
S.top=S.base; //栈顶指针等于栈底指针
S.stacksize=MAXSIZE;
return OK;
}
判断顺序栈是否为空
int StackEmpty(SqStack S){ //若栈为空,返回TURE,否则返回FALSE
if(S.top==S.base)
return TRUE;
else
return FALSE;
}
顺序栈的入栈
int Push(SqStack &S,int e){
if(S.top-S.base==S.stacksize) return ERROR; //栈满
*S.top++=e; //*S.top=e; S.top++;
return OK;
}
顺序栈的出栈
int Pop(SqStack &S,int &e){ //出栈操作:删除S的站点元素An,并用e返回其值
if(S.top==S.base) return ERROR; //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
e=*--S.top; //--S.top; e=*S.top;
return OK;
}
算法实现
int InOrderTraverse_no(BiTree T) {
BiTree p, q;
InitStack(S);
p = T;
while (p || !StackEmpty(S)) {
if (p) {
Push(S, p->data);
p = p->lchild;
} else {
Pop(S, q->data);
printf("%c", q->data);
p = q->rchild;
}
}
return OK;
}