巧妙位运算合并坐标2个数x,y,结果作为子窗口ID,当求坐标时再拆开ID得到坐标(x,y)

本文介绍了一种通过位操作来组合和分解子窗口ID的方法。利用左移和按位或操作将x和y坐标组合成一个整数作为子窗口ID,并通过按位与和右移操作将该ID分解回原始坐标。示例代码展示了如何实现这一过程。

//  计算结果是25个子窗口的ID,即idFocus

  hwnd, (HMENU) (y << 8 | x), 


  // 现在要把idFocus拆开得到 x,y 
          x = idFocus & 0xFF ;
          y = idFocus >> 8 ;


#include <stdio.h>
int main(int argc, char *argv[])
{
	int i,j;

	int id[5][5];//子窗口的ID

	for(i=0;i<5;i++)
		for(j=0;j<5;j++)id[i][j]= j<<8|i;	//j左移动8bit 再与i 或运算	

	for(i=0;i<5;i++)
		for(j=0;j<5;j++)
		{
			 printf("%d\t",id[i][j]);
			 if(j==4)printf("\n");
		}

	printf("--------------------------------------\n");
   
	int x,y;
   for(i=0;i<5;i++)
		for(j=0;j<5;j++)
		{
			x = id[i][j] & 0xFF;// 看不懂......1111 1111 
			y = id[i][j]>>8;
			printf("%d,%d\t",x,y);
           if(j==4)printf("\n");
		}



    printf("Hello, world!\n");
    return 0;
}



把id[i][j] 用十六进制输出 :printf("%0X\t",id[i][j]);

 




``` % 观测数据输入 X = [4.5596, 5.0816, 5.5546, 5.9636, 6.2756]; Y = [0.8145, 1.3685, 1.9895, 2.6925, 3.5265]; % 绘制散点图查看初步趋势 figure; scatter(X, Y); xlabel('X 坐标 (AU)'); ylabel('Y 坐标 (AU)'); title('小行星观测位置'); grid on; % 使用最小二乘法拟合椭圆 A = @(XY,a,b,x0,y0,theta) ((XY(:,1)-x0)*cos(theta)+(XY(:,2)-y0)*sin(theta)).^2/a^2 + ... ((XY(:,2)-y0)*cos(theta)-(XY(:,1)-x0)*sin(theta)).^2/b^2 - 1; nlsq = @(p) sum(A([X',Y'], p(1), p(2), p(3), p(4), p(5)).^2); % 初始猜测值 p0 = [1, 1, mean(X), mean(Y), 0]; % a, b, x0, y0, theta % 进行非线性最小二乘优化解 p = lsqnonlin(nlsq, p0); % 提取结果 a = abs(p(1)); b = abs(p(2)); x0 = p(3); y0 = p(4); theta = mod(p(5), pi); % 计算并绘制拟合后的椭圆轨迹 t = linspace(0, 2*pi, 1000); xE = a*cos(t)*cos(theta) - b*sin(t)*sin(theta) + x0; yE = a*cos(t)*sin(theta) + b*sin(t)*cos(theta) + y0; hold on; plot(xE, yE, 'r-', 'LineWidth', 2); legend('观测点','拟合椭圆'); axis equal; %222 % 长半轴和短半轴 fprintf('长半轴长度: %.4f AU\n', max(a,b)); fprintf('短半轴长度: %.4f AU\n', min(a,b)); % 半焦距 c c = sqrt(abs(a^2-b^2)); % 近日点距离 q 和远日点距离 Q q = a*(1-c/a); Q = a*(1+c/a); fprintf('近日点距离: %.4f AU\n', q); fprintf('远日点距离: %.4f AU\n', Q); %33333 % 近日点坐标 [q_x, q_y] = pol2cart(mod(pi-theta, 2*pi), q)+deal(x0, y0); fprintf('近日点坐标: (%.4f, %.4f) AU\n', q_x, q_y); % 远日点坐标 [Q_x, Q_y] = pol2cart(mod(-pi-theta, 2*pi), Q)+deal(x0, y0); fprintf('远日点坐标: (%.4f, %.4f) AU\n', Q_x, Q_y); % 轨道周长近似公式 L = pi * (3*(a+b) - sqrt((3*a+b)*(a+3*b))); fprintf('椭圆轨道周长大约是: %.4f AU\n', L);```运行显示这一行出错,无法将该表达式赋值给多个值
最新发布
03-28
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值