7—4移位和进制转化

本题目要求读入1个十进制的数A,将A按位右移1位,输出移位后的数的二进制、八进制、十六进制表示结果
(如果A不是整数,需要对其取整后再移位)

输入格式:
输入十进制的数

输出格式:
输出的结果用“| * |”进行分隔

A=float(input())
a=int(A)>>1
print(f'{a:b}',f'{a:o}',f'{a:x}',sep='| * |')
  • 这篇博客: 实验项目三:基于A*搜索算法迷宫游戏开发中的 七、附加 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 前面的A* 算法调试有时会出现一点问题,因此重新使用了C++配合Python的方式,实现自动寻路的A*算法。
    首先用DEV C++生成地图文本,语法基本同前面地图生成语句,只不过增加了循环写入到txt文本中。

    for (int i=0;i<=m+1;i++) {
    		outfile<<"    '";
    		for (int j=0;j<=n+1;j++) {
    			if(i == start.x && j == start.y) {
    				outfile<<"S";
    			} 
    			else if(i== m&&j==n){
    				outfile<<"E";
    			}
    			else if(G[i][j] == NOTHING) {
    				outfile<<".";
    			} 
    			else {
    				outfile<<"#";
    			}
    		}
    		outfile<<"',\n";
    	}
    	outfile.close();//关闭文件,保存文件。
    

    随机生成的地图文本如下:
    在这里插入图片描述
    将生成的文本复制到python的tm数组中,作为地图基本参数。并对基本界面进行设计。

    for i in range(self.width):
        for j in range(self.height):
            if test_map[j][i] == '#':
                node = self.canvas.create_rectangle(i * 10 + 50 - self.__r,
                                               j * 10 + 50 - self.__r, i * 10 + 50 + self.__r,
                                               j * 10 + 50 + self.__r,
                                               fill="#000000", 
                                               outline="#ffffff", 
                                               tags="node",
                                               )
            if test_map[j][i] == '*':
                node = self.canvas.create_rectangle(i * 10 + 50 - self.__r,
                                               j * 10 + 50 - self.__r, i * 10 + 50 + self.__r,
                                               j * 10 + 50 + self.__r,
                                               fill="#00ff00", 
                                               outline="#ffffff", 
                                               tags="node",
                                               )
    

    调试程序,界面如下图:
    在这里插入图片描述

    部分A* 寻路核心代码如下:

        def find_path(self):
            p = Node_Elem(None, self.s_x, self.s_y, 0.0)
            while True:
                self.extend_round(p)
                if not self.open:
                    return
                idx, p = self.get_best()
                if self.is_target(p):
                    self.make_path(p)
                    return
                self.close.append(p)
                del self.open[idx]
    
        def make_path(self, p):
            while p:
                self.path.append((p.x, p.y))
                p = p.parent
    
        def is_target(self, i):
            return i.x == self.e_x and i.y == self.e_y
    
        def get_best(self):
            best = None
            bv = 10000000  # MAX值
            bi = -1
            for idx, i in enumerate(self.open):
                value = self.get_dist(i)
                if value < bv:
                    best = i
                    bv = value
                    bi = idx
            return bi, best
    
        def get_dist(self, i):
            # F = G + H
            # G 为当前路径长度,H为估计长度
            return i.dist + math.sqrt((self.e_x - i.x) * (self.e_x - i.x)) + math.sqrt((self.e_y - i.y) * (self.e_y - i.y))
    
    

    在这里插入图片描述
    可在DEV C++中运行DrawMaze程序生成新地图并用Pycharm进行A*寻路
    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    首先需要将输入的十进制数转换为整数类型,可以使用int()函数进行转换。

    然后使用位运算符>>进行按位右移,右移的位数需要根据题目要求确定。移位后需要将结果转换为二进制、八进制和十六进制表示。

    具体步骤如下:

    1.输入十进制数并转换为整数类型:

    dec_num = int(input("请输入十进制数:"))
    

    2.根据题目要求进行位移,例如右移3位:

    shift_num = dec_num >> 3
    

    3.将移位后的结果转换为二进制、八进制、十六进制表示,并用“| * |”进行分隔输出:

    bin_num = bin(shift_num)
    oct_num = oct(shift_num)
    hex_num = hex(shift_num)
    print(bin_num, oct_num, hex_num, sep="|*|")
    

    注意:如果输入的不是整数,需要对其取整再进行移位。

    完整代码如下:

    dec_num = int(input("请输入十进制数:"))
    if dec_num != int(dec_num):
        print("输入的不是整数,已将其取整。")
        dec_num = int(dec_num)
    shift_num = dec_num >> 3
    bin_num = bin(shift_num)
    oct_num = oct(shift_num)
    hex_num = hex(shift_num)
    print(bin_num, oct_num, hex_num, sep="|*|")