Number of 1 Bits (easy)

本文详细介绍了二进制中1的个数计数算法的两种方法,包括一种基本方法和一种优化方法。优化方法通过位运算实现更高效的计算,适用于不同场景需求。

最简单最直接的做法:

class Solution {

public:
    int hammingWeight(uint32_t n)
    {
      int num = 0;
      while (n != 0)
      {
        if (n % 2 != 0) // mod
          {
            num += 1;
          }
        n /=2; // division
      }
    return num;  
    }

};

这是最简单的一种方法,每一次对2求余都能得到目前该数的最后一位数字:如7是111,除以2得11,余数为1;然后11再除以2得1,余数为1;1再除以2得0,余数为1.所以三个1.

其实,这个方法很好理解,但是由于我们日常生活思考时用的十进制,所以对二进制的思考略微困难,那我们不妨用十进制来看一下:如若问你一个十进制数里有几个1,你怎么算呢(不写成二进制),如19181918,是不是先除以10,得1918191,余8,最后一位为8;再用1918191除以10,余1,最后一位为1,1的个数加1。。。每次除以该进制就可以得到该进制写法的最后一位数字是多少。

较快捷的做法:

class Solution {
public:
    int hammingWeight(uint32_t n)
    {
      int num = 0;
      while (n != 0)
      {
        n=(n-1)&n;
        num += 1;
      }
    return num;  
    }
};

这里面用了一个非常巧妙的方法,即n=(n-1)&n,那这个能起到什么作用呢?我们举个栗子来看一下:若n=01010,则n-1为01001,两个求与为01000,发现了什么,成功消去了最后一位1,依次类推,能消去几个就代表几个1,所以该方法的执行速度与1的个数有关。而上一个算法的执行速度与该数最高位1所在的位数有关,如1000000000,虽然只有一个1,但必须执行10次。

%%% PROGRAM TO ANALYSE DATA RECORDED USING DCA1000 AND AWR1243 for the file saved in ppro/data1. clc; clear all; close all; %% global variables % Based on sensor configuration. numADCBits = 16; % number of ADC bits per sample. numADCSamples = 256; % number of ADC samples per chirp. numRx = 4; % number of receivers in AWR1243. chirpSize = numADCSamples*numRx; chirploops= 128; % No. of of chirp loops. numLanes = 2; % do not change. number of lanes is always 4 isReal = 0; % set to 1 if real only data, 0 if complex data. numFrames = 200; numChirps = 1; sampleRate = 10; % [Msps] timeStep = 1/sampleRate; % [us] chirpPeriod = numADCSamples * timeStep ; % [us] plotEnd = numADCSamples * numChirps*numFrames; %for considering all frames. Dx = numADCSamples * numChirps ; timeEnd = (plotEnd-1) * timeStep; %% read file % read .bin file fid = fopen('adc_data.bin','r'); % adcData = fread(fid, 'int16'); % fclose(fid); % fileSize = size(adcData, 1); % % % % % % % % adcData = fread(fid, 'int16'); % if 12 or 14 bits ADC per sample compensate for sign extension if numADCBits ~= 16 l_max = 2^(numADCBits-1)-1; adcData(adcData > l_max) = adcData(adcData > l_max) - 2^numADCBits; end fclose(fid); fileSize = size(adcData, 1); % real data reshape, filesize = numADCSamples*numChirps if isReal numChirps = fileSize/numADCSamples/numRx; LVDS = zeros(1, fileSize); %create column for each chirp LVDS = reshape(adcData, numADCSamples*numRx, numChirps); %each row is data from one chirp LVDS = LVDS.'; else % for complex data % filesize = 2 * numADCSamples*numChirps numChirps = fileSize/2/numADCSamples/numRx; LVDS = zeros(1, fileSize/2); %combine real and imaginary part into complex data %read in file: 2I is followed by 2Q counter = 1; for i=1:4:fileSize-1 LVDS(1,counter) = adcData(i) + sqrt(-1)*adcData(i+2); LVDS(1,counter+1) = adcData(i+1)+sqrt(-1)*adcData(i+3); counter = counter + 2; end % create column for each chirp LVDS = reshape(LVDS, numADCSamples*numRx, numChirps); %each row is data from one chirp LVDS = LVDS.'; end %organize data per RX adcData = zeros(numRx,numChirps*numADCSamples); adc_r1=[]; adc_r2=[]; adc_r3=[]; adc_r4=[]; for i=1:256 adc_r1(:,i) = LVDS(:,i); adc_r2(:,i) = LVDS(:,i+256); adc_r3(:,i) = LVDS(:,i+512); adc_r4(:,i) = LVDS(:,i+768); end new_pos = []; new_val = []; new_pos_cal=[]; % easy_positions=zeros(200,200); signal_fft_2=[]; complete_signal_fft=[]; % plotting for all frames (Channel 1) complete_signal_fft_1 = []; complete_signal_fft_2 = []; complete_signal_fft_3 = []; complete_signal_fft_4 = []; Doppler_all_1 = []; Doppler_all_2 = []; Doppler_all_3 = []; Doppler_all_4 = []; % N = 25; freq_point = 6; rec1_mean=[]; doppler_axis = linspace(-freq_point,freq_point,chirploops); range_axis = linspace(-25, 25, 256); all_fr_1_2=[]; all_fr_2_3=[]; all_fr_1_3=[]; all_fr_2_4=[]; all_fr_1_4=[]; all_fr_3_4=[]; for n = 1 : numFrames u = n - 1; ff_tp = LVDS(1+128*u:128+128*u,:); rec1 = ff_tp(:,1:256); rec2 = ff_tp(:,257:512); rec3 = ff_tp(:,513:768); rec4 = ff_tp(:,769:1024); rec1_fft = fft(rec1'); rec2_fft = fft(rec2'); rec3_fft = fft(rec3'); rec4_fft = fft(rec4'); fftsrec1 = flip(fftshift(rec1_fft)); fftsrec2 = flip(fftshift(rec2_fft)); fftsrec3 = flip(fftshift(rec3_fft)); fftsrec4 = flip(fftshift(rec4_fft)); fftsrec1([1:143],:)=0; fftsrec2([1:143],:)=0; fftsrec3([1:143],:)=0; fftsrec4([1:143],:)=0; [pos_val_1, pos_1] = max(fftsrec1); [pos_val_2, pos_2] = max(fftsrec2); [pos_val_3, pos_3] = max(fftsrec3); [pos_val_4, pos_4] = max(fftsrec4); angle_pos_1 = angle(pos_val_1); angle_pos_2 = angle(pos_val_2); angle_pos_3 = angle(pos_val_3); angle_pos_4 = angle(pos_val_4); sin_inv_angle_pos_1_2 = asind(abs(angle_pos_1 - angle_pos_2)/3.14); sin_inv_angle_pos_1_3 = asind(abs(angle_pos_1 - angle_pos_3)/3.14); sin_inv_angle_pos_1_4 = asind(abs(angle_pos_1 - angle_pos_4)/3.14); sin_inv_angle_pos_2_3 = asind(abs(angle_pos_2 - angle_pos_3)/3.14); sin_inv_angle_pos_2_4 = asind(abs(angle_pos_2 - angle_pos_4)/3.14); sin_inv_angle_pos_3_4 = asind(abs(angle_pos_3 - angle_pos_4)/3.14); mean_1_2 = real(mean(sin_inv_angle_pos_1_2)); mean_1_3 = real(mean(sin_inv_angle_pos_1_3)); mean_1_4 = real(mean(sin_inv_angle_pos_1_4)); mean_2_3 = real(mean(sin_inv_angle_pos_2_3)); mean_2_4 = real(mean(sin_inv_angle_pos_2_4)); mean_3_4 = real(mean(sin_inv_angle_pos_3_4)); all_fr_1_2 = [all_fr_1_2 mean_1_2]; all_fr_1_3 = [all_fr_1_3 mean_1_3]; all_fr_1_4 = [all_fr_1_4 mean_1_4]; all_fr_2_3 = [all_fr_2_3 mean_2_3]; all_fr_2_4 = [all_fr_2_4 mean_2_4]; all_fr_3_4 = [all_fr_3_4 mean_3_4]; angle1 = angle(fftsrec1); angle2 = angle(fftsrec2); angle3 = angle(fftsrec3); angle4 = angle(fftsrec4); angle_diff_1_2 = abs(angle1-angle2); sin_inv_angle_1_2=asind(angle_diff_1_2/3.14); angle_diff_1_3 = abs(angle1-angle3); sin_inv_angle_1_3=asind(angle_diff_1_3/(2*3.14)); angle_diff_1_4 = abs(angle1-angle4); sin_inv_angle_1_4=asind(angle_diff_1_4/(3*3.14)); angle_diff_2_3 = abs(angle2-angle3); sin_inv_angle_2_3=asind(angle_diff_2_3/3.14); angle_diff_2_4 = abs(angle2-angle4); sin_inv_angle_2_4=asind(angle_diff_2_4/(2*3.14)); angle_diff_3_4 = abs(angle3-angle4); sin_inv_angle_3_4=asind(angle_diff_3_4/3.14); figure(1); plot(range_axis,abs(fftsrec1(:,128))); grid on; figure(2); plot(range_axis,abs(fftsrec2(:,128))); grid on; % drawnow; end final_angle_1_2 = mean(all_fr_1_2); final_angle_1_3 = mean(all_fr_1_3); final_angle_1_4 = mean(all_fr_1_4); final_angle_2_3 = mean(all_fr_2_3); final_angle_2_4 = mean(all_fr_2_4); final_angle_3_4 = mean(all_fr_3_4); final_angle_avg = (final_angle_1_2+final_angle_1_4+final_angle_2_4+final_angle_1_3+final_angle_2_3+final_angle_2_3)/6; final_angle_avg_on_3 = (final_angle_1_2+final_angle_2_3+final_angle_3_4)/3 % % % % ========= (3) MUSIC ALGORITHM ========= % % % Sample covariance matrix % Rxx = x*x'/L; % d = 0.5;% Distance between elements in Wavelengyh % [Q ,D] = eig(Rxx); %Compute eigendecomposition of covariance matrix % [D, I] = sort(diag(D),1,'descend'); %Find r largest eigenvalues % Q = Q(:,I); %Sort the eigenvectors to put signal eigenvectors first % Qs = Q(:,1:M); %Get the signal eigenvectors % Qn = Q(:,M+1:Ant); %Get the noise eigenvectors % % MUSIC algorithm % % Define angles at which MUSIC �spectrum� will be computed % angles = (-28:1:28); % for k = 1 : length(angles) % a1(:,k) = exp(-1i*2*pi*(d*(0:Ant-1)'*sin([angles(k).']*pi/180))); % end % for k = 1 : length(angles) % %Compute MUSIC �spectrum� % music_spectrum(k) = (a1(:,k)'*a1(:,k))/(a1(:,k)'*(Qn*Qn')*a1(:,k)); % end % plot(angles,abs(music_spectrum)); % grid on; title('MUSIC Spectrum Angle estimation'); xlabel('Angle in degrees'); % hold on; % % % % % % s_fft = mean(signal_fft_2'); % new_pos_cal(isnan(new_pos_cal))=0; % % new_pos_cal_2 = mean(new_pos_cal); % new_pos_cal_2 = max(new_pos_cal); % [mxpp_new, lopp_new] = max(new_pos_cal_2); % % subplot(2,2,4); % plot(range,new_pos_cal_2); % plot(range(lopp_new),mxpp_new,'r--o','MarkerSize',10); % title(sprintf('Average of all frame, Drone is at %f', range(lopp_new))); % axis tight; grid on; xlabel('Range (m)'); ylabel('Amplitude'); % grid minor; hold on; % % %%% Micro Doppler Signatures % frameTime = 0.040; % 40ms per frame % freq_point = 6; % totalTime = frameTime*numFrames; % % n1 = 80; n2 = n1+1; n3 = n1+2; n4 = n1+3; % md1 = complete_signal_fft(n1,:); md2 = complete_signal_fft(n2,:); % md3 = complete_signal_fft(n3,:); md4 = complete_signal_fft(n4,:); % new_md1 = []; new_md2 = []; new_md3 = []; new_md4 = []; % delta = 12; numb = 100; i_end = (length(md1) - numb)/delta + 1; % for i = 1 : i_end % new_md1(:,i) = fft(md1( 1 + (i-1)*delta : (i-1)*delta + numb )); % new_md2(:,i) = fft(md2( 1 + (i-1)*delta : (i-1)*delta + numb )); % new_md3(:,i) = fft(md3( 1 + (i-1)*delta : (i-1)*delta + numb )); % new_md4(:,i) = fft(md4( 1 + (i-1)*delta : (i-1)*delta + numb )); % end % % figure('Name','micro doppler'); % time_axis = linspace(0,totalTime,i_end); freq_axis = linspace(-freq_point,freq_point,numb); % subplot(2,2,2); imagesc(time_axis,freq_axis,mag2db(abs(fftshift(new_md1)))); % xlabel('Time (s)'), ylabel('Frequency (Hz)'); axis tight; grid on; grid minor; % % title([' drone at ' num2str(distance(n1))],'Interpreter','tex');能否根据该代码,生成一个adc_data.bin文件用于高度测量
09-13
内容概要:本文介绍了一种基于蒙特卡洛模拟和拉格朗日优化方法的电动汽车充电站有序充电调度策略,重点针对分时电价机制下的分散式优化问题。通过Matlab代码实现,构建了考虑用户充电需求、电网负荷平衡及电价波动的数学模【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)型,采用拉格朗日乘子法处理约束条件,结合蒙特卡洛方法模拟大量电动汽车的随机充电行为,实现对充电功率和时间的优化分配,旨在降低用户充电成本、平抑电网峰谷差并提升充电站运营效率。该方法体现了智能优化算法在电力系统调度中的实际应用价值。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源汽车、智能电网相关领域的工程技术人员。; 使用场景及目标:①研究电动汽车有序充电调度策略的设计与仿真;②学习蒙特卡洛模拟与拉格朗日优化在能源系统中的联合应用;③掌握基于分时电价的需求响应优化建模方法;④为微电网、充电站运营管理提供技术支持和决策参考。; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注目标函数构建、约束条件处理及优化求解过程,可尝试调整参数设置以观察不同场景下的调度效果,进一步拓展至多目标优化或多类型负荷协调调度的研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值