2/(-2)的值是多少?

除法运算在小学就掌握了的,这里还要讨论什么呢?别急,先计算下面这个例子:
2/(-2)的值为多少?2%(-2)的值呢?
如果与你想象的结果不一致,不要惊讶。我们先看看下面这些规则:
假定我们让a 除以b,商为q,余数为r:
q = a/b;
r = a%b;
这里不妨先假定b 大于0。
我们希望a、b、q、r 之间维持什么样的关系呢?
1,最重要的一点,我们希望q*b + r == a,因为这是定义余数的关系。
2,如果我们改变a 的正负号,我们希望q 的符号也随之改变,但q 的绝对值不会变。
3,当b>0 时,我们希望保证r>=0 且r<b。
这三条性质是我们认为整数除法和余数操作所应该具备的。但是,很不幸,它们不可
能同时成立。
先考虑一个简单的例子:3/2,商为1,余数也为1。此时,第一条性质得到了满足。
好,把例子稍微改写一下:(-3)/2 的值应该是多少呢?如果要满足第二条性质,答案应
该是-1。但是,如果是这样,余数就必定是-1,这样第三条性质就无法满足了。如果我们首
先满足第三条性质,即余数是1,这种情况下根据第一条性质,商应该为-2,那么第二条性
质又无法满足了。
上面的矛盾似乎无法解决。因此,C 语言或者其他语言在实现整数除法截断运算时,必
须放弃上述三条性质中的至少一条。大多数编程语言选择了放弃第三条,而改为要求余数与
被除数的正负号相同。这样性质1 和性质2 就可以得到满足。大多数C 语言编译器也都是
如此。
但是,C 语言的定义只保证了性质1,以及当a>=0 且b>0 时,保证|r|<|b|以及r>=0。后
面部分的保证与性质2 或性质3 比较起来,限制性要弱得多。
通过上面的解释,你是否能准确算出2/(-2)和2%(-2)的值呢?

已知module median_filter_core ( input clk, input rstn, input [20:0] base_addr, // ?top?????????? input [63:0] mem_di, // ??????? output reg [20:0] mem_adr, // ?????? output reg [63:0] mem_do, // ??????? output reg mem_csn, // ????????? output reg [7:0] mem_wen, // ?????????? input start, // ???? output reg done // ?????? ); // -------------------------------------------- // ???? // -------------------------------------------- parameter IMG_WIDTH = 256; // ???????? parameter IMG_HEIGHT = 256; // ???????? parameter PIXEL_BITS = 16; // ????????16????? // ????????????enum? parameter IDLE = 3'd0, READ_ROW1 = 3'd1, READ_ROW2 = 3'd2, READ_ROW3 = 3'd3, SORTING = 3'd4, WRITE_MEDIAN = 3'd5, UPDATE_POS = 3'd6, FINISH = 3'd7; // -------------------------------------------- // ????? // -------------------------------------------- reg [2:0] state; // ??? reg [15:0] window_0, window_1, window_2, window_3, window_4, window_5, window_6, window_7, window_8; // 3x3???? reg [20:0] x, y; // ???????? reg [20:0] current_addr; // ?????? reg [3:0] read_steps; // ??????? reg [3:0] sort_counter; // ??????? reg [15:0] median_value; // ??????? integer i; // Verilog-2001????????? // -------------------------------------------- // ???????? // -------------------------------------------- always @(posedge clk or negedge rstn) begin if (!rstn) begin state <= IDLE; done <= 0; mem_csn <= 1; mem_wen <= 8'hFF; x <= 1; y <= 1; current_addr <= 0; read_steps <= 0; sort_counter <= 0; // ????????Verilog-2001????? window_0 <= 0; window_1 <= 0; window_2 <= 0; window_3 <= 0; window_4 <= 0; window_5 <= 0; window_6 <= 0; window_7 <= 0; window_8 <= 0; end end // -------------------------------------------- // ???? // -------------------------------------------- always @(posedge clk) begin if (!rstn) begin state <= IDLE; end else begin case (state) IDLE: begin done <= 0; if (start) begin current_addr <= base_addr + (IMG_WIDTH + 1)*2; // ????(1,1)?? state <= READ_ROW1; mem_csn <= 0; mem_adr <= base_addr; end end READ_ROW1: begin mem_adr <= current_addr - IMG_WIDTH*2 - 2; // (x-1,y-1) state <= READ_ROW2; end READ_ROW2: begin window_0 <= mem_di[15:0]; // ?????? mem_adr <= current_addr - IMG_WIDTH*2; // (x,y-1) state <= READ_ROW3; end READ_ROW3: begin window_1 <= mem_di[15:0]; // ?????? window_3 <= mem_di[63:48]; // ?????? mem_adr <= current_addr; // (x,y)???? state <= SORTING; end SORTING: begin // ???????????????? if (window_1 > window_3) begin median_value <= (window_1 + window_3) / 2; end else begin median_value <= (window_3 + window_1) / 2; end state <= WRITE_MEDIAN; end WRITE_MEDIAN: begin mem_do <= {4{median_value}}; // 64???? mem_wen <= 8'h00; // ?????? state <= UPDATE_POS; end UPDATE_POS: begin mem_wen <= 8'hFF; // ????? if (x < IMG_WIDTH-2) begin x <= x + 1; current_addr <= current_addr + 2; // ???????2?? end else begin x <= 1; if (y < IMG_HEIGHT-2) begin y <= y + 1; current_addr <= current_addr + 4; // ??? end else begin state <= FINISH; end end if (state != FINISH) begin state <= READ_ROW1; end end FINISH: begin done <= 1; state <= IDLE; end endcase end end endmodule和module median_filter_core ( input clk, input rstn, input [20:0] base_addr, // ?top?????????? input [63:0] mem_di, // ??????? output reg [20:0] mem_adr, // ?????? output reg [63:0] mem_do, // ??????? output reg mem_csn, // ????????? output reg [7:0] mem_wen, // ?????????? input start, // ???? output reg done // ?????? ); // -------------------------------------------- // ???? // -------------------------------------------- parameter IMG_WIDTH = 256; // ???????? parameter IMG_HEIGHT = 256; // ???????? parameter PIXEL_BITS = 16; // ????????16????? // ????????????enum? parameter IDLE = 3'd0, READ_ROW1 = 3'd1, READ_ROW2 = 3'd2, READ_ROW3 = 3'd3, SORTING = 3'd4, WRITE_MEDIAN = 3'd5, UPDATE_POS = 3'd6, FINISH = 3'd7; // -------------------------------------------- // ????? // -------------------------------------------- reg [2:0] state; // ??? reg [15:0] window_0, window_1, window_2, window_3, window_4, window_5, window_6, window_7, window_8; // 3x3???? reg [20:0] x, y; // ???????? reg [20:0] current_addr; // ?????? reg [3:0] read_steps; // ??????? reg [3:0] sort_counter; // ??????? reg [15:0] median_value; // ??????? integer i; // Verilog-2001????????? // -------------------------------------------- // ???????? // -------------------------------------------- always @(posedge clk or negedge rstn) begin if (!rstn) begin state <= IDLE; done <= 0; mem_csn <= 1; mem_wen <= 8'hFF; x <= 1; y <= 1; current_addr <= 0; read_steps <= 0; sort_counter <= 0; // ????????Verilog-2001????? window_0 <= 0; window_1 <= 0; window_2 <= 0; window_3 <= 0; window_4 <= 0; window_5 <= 0; window_6 <= 0; window_7 <= 0; window_8 <= 0; end end // -------------------------------------------- // ???? // -------------------------------------------- always @(posedge clk) begin if (!rstn) begin state <= IDLE; end else begin case (state) IDLE: begin done <= 0; if (start) begin current_addr <= base_addr + (IMG_WIDTH + 1)*2; // ????(1,1)?? state <= READ_ROW1; mem_csn <= 0; mem_adr <= base_addr; end end READ_ROW1: begin mem_adr <= current_addr - IMG_WIDTH*2 - 2; // (x-1,y-1) state <= READ_ROW2; end READ_ROW2: begin window_0 <= mem_di[15:0]; // ?????? mem_adr <= current_addr - IMG_WIDTH*2; // (x,y-1) state <= READ_ROW3; end READ_ROW3: begin window_1 <= mem_di[15:0]; // ?????? window_3 <= mem_di[63:48]; // ?????? mem_adr <= current_addr; // (x,y)???? state <= SORTING; end SORTING: begin // ???????????????? if (window_1 > window_3) begin median_value <= (window_1 + window_3) / 2; end else begin median_value <= (window_3 + window_1) / 2; end state <= WRITE_MEDIAN; end WRITE_MEDIAN: begin mem_do <= {4{median_value}}; // 64???? mem_wen <= 8'h00; // ?????? state <= UPDATE_POS; end UPDATE_POS: begin mem_wen <= 8'hFF; // ????? if (x < IMG_WIDTH-2) begin x <= x + 1; current_addr <= current_addr + 2; // ???????2?? end else begin x <= 1; if (y < IMG_HEIGHT-2) begin y <= y + 1; current_addr <= current_addr + 4; // ??? end else begin state <= FINISH; end end if (state != FINISH) begin state <= READ_ROW1; end end FINISH: begin done <= 1; state <= IDLE; end endcase end end endmodule和module median_filter_core ( input clk, input rstn, input [20:0] base_addr, // ?top?????????? input [63:0] mem_di, // ??????? output reg [20:0] mem_adr, // ?????? output reg [63:0] mem_do, // ??????? output reg mem_csn, // ????????? output reg [7:0] mem_wen, // ?????????? input start, // ???? output reg done // ?????? ); // -------------------------------------------- // ???? // -------------------------------------------- parameter IMG_WIDTH = 256; // ???????? parameter IMG_HEIGHT = 256; // ???????? parameter PIXEL_BITS = 16; // ????????16????? // ????????????enum? parameter IDLE = 3'd0, READ_ROW1 = 3'd1, READ_ROW2 = 3'd2, READ_ROW3 = 3'd3, SORTING = 3'd4, WRITE_MEDIAN = 3'd5, UPDATE_POS = 3'd6, FINISH = 3'd7; // -------------------------------------------- // ????? // -------------------------------------------- reg [2:0] state; // ??? reg [15:0] window_0, window_1, window_2, window_3, window_4, window_5, window_6, window_7, window_8; // 3x3???? reg [20:0] x, y; // ???????? reg [20:0] current_addr; // ?????? reg [3:0] read_steps; // ??????? reg [3:0] sort_counter; // ??????? reg [15:0] median_value; // ??????? integer i; // Verilog-2001????????? // -------------------------------------------- // ???????? // -------------------------------------------- always @(posedge clk or negedge rstn) begin if (!rstn) begin state <= IDLE; done <= 0; mem_csn <= 1; mem_wen <= 8'hFF; x <= 1; y <= 1; current_addr <= 0; read_steps <= 0; sort_counter <= 0; // ????????Verilog-2001????? window_0 <= 0; window_1 <= 0; window_2 <= 0; window_3 <= 0; window_4 <= 0; window_5 <= 0; window_6 <= 0; window_7 <= 0; window_8 <= 0; end end // -------------------------------------------- // ???? // -------------------------------------------- always @(posedge clk) begin if (!rstn) begin state <= IDLE; end else begin case (state) IDLE: begin done <= 0; if (start) begin current_addr <= base_addr + (IMG_WIDTH + 1)*2; // ????(1,1)?? state <= READ_ROW1; mem_csn <= 0; mem_adr <= base_addr; end end READ_ROW1: begin mem_adr <= current_addr - IMG_WIDTH*2 - 2; // (x-1,y-1) state <= READ_ROW2; end READ_ROW2: begin window_0 <= mem_di[15:0]; // ?????? mem_adr <= current_addr - IMG_WIDTH*2; // (x,y-1) state <= READ_ROW3; end READ_ROW3: begin window_1 <= mem_di[15:0]; // ?????? window_3 <= mem_di[63:48]; // ?????? mem_adr <= current_addr; // (x,y)???? state <= SORTING; end SORTING: begin // ???????????????? if (window_1 > window_3) begin median_value <= (window_1 + window_3) / 2; end else begin median_value <= (window_3 + window_1) / 2; end state <= WRITE_MEDIAN; end WRITE_MEDIAN: begin mem_do <= {4{median_value}}; // 64???? mem_wen <= 8'h00; // ?????? state <= UPDATE_POS; end UPDATE_POS: begin mem_wen <= 8'hFF; // ????? if (x < IMG_WIDTH-2) begin x <= x + 1; current_addr <= current_addr + 2; // ???????2?? end else begin x <= 1; if (y < IMG_HEIGHT-2) begin y <= y + 1; current_addr <= current_addr + 4; // ??? end else begin state <= FINISH; end end if (state != FINISH) begin state <= READ_ROW1; end end FINISH: begin done <= 1; state <= IDLE; end endcase end end endmodule完成中滤波的算法设计 其中滤波的窗口采用3x3大小; 算法测试时,采用目录中的测试图像作为输入,验证算法效果。 注:测试图像包含了两种格式,一种是bmp格式的RGB888,另一为raw格式,仅仅包含灰度信息,每一个像素的灰度信息为16-bit(也就是两个byte);
最新发布
06-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值