1

这很难解释,但我会尽力而为。

我正在使用带有网络服务器的 PLC 和一些我编写的 JavaScript 代码,用于将 PLC 寄存器中的值写入您的网页。

PLC 具有的功能之一是时间表(例如,您可以选择灯必须亮起的日期和时间)。为了设置时间表,我为时间创建了一些输入框,并为一周中的每一天创建了 7 个复选框。您必须将十进制值发送给控制器,这对于小时和分钟来说没有问题。

但是,工作日用二进制数表示,但我需要将其以十进制写入控制器。

所以我有 7 个复选框,每个复选框代表一个二进制数字(所以星期一是 1,星期二是 2,星期三是 4,星期四是 8,依此类推)所以当我想从中创建一个十进制数时,这很容易,只需总结检查了哪些复选框,完成了。

但是现在我需要它,这次我从控制器得到一个十进制数(表示设置了哪些天),我需要在复选框上表示它,所以可能将十进制转换为二进制但是我如何链接复选框到单个数字?

希望有人能理解这一点并帮助我。

<input type="checkbox" id="mon"></td>
<input type="checkbox" id="tue"></td>
<input type="checkbox" id="wed"></td>
<input type="checkbox" id="thu"></td>
<input type="checkbox" id="fri"></td>
<input type="checkbox" id="sat"></td>
<input type="checkbox" id="sun"></td>

这些是我的复选框,这是我的一些 javascript:

var Weekday = 0;
if($('#mon').is(':checked')){ Weekday += 1 }  //this is code to create the decimal number 
if($('#tue').is(':checked')){ Weekday += 2 }
if($('#wed').is(':checked')){ Weekday += 4 }
if($('#thu').is(':checked')){ Weekday += 8 }
if($('#fri').is(':checked')){ Weekday += 16 }
if($('#sat').is(':checked')){ Weekday += 32 }
if($('#sun').is(':checked')){ Weekday += 64 }

我该如何反其道而行之?我得到一个十进制数,需要转换为二进制,然后使用 javascript 根据设置的位检查正确的复选框。

有什么建议么?

4

3 回答 3

3

您可以使用按位运算符。

例如。

var number = 54;
if (number & 1) { $('#mon').attr('checked', 'checked'); }

if (number & 2) { $('#tue').attr('checked', 'checked'); }

if (number & 4) { $('#wed').attr('checked', 'checked'); }

if (number & 8) { $('#thu').attr('checked', 'checked'); }

if (number & 16) { $('#fri').attr('checked', 'checked'); }

ETC...

于 2013-04-24T15:58:06.920 回答
2

数字的二进制分解:

 function getOnesAndZeroesFromInt(weekdays){
     var tab = [];
     for(var i=0; i<7; i++){
         tab[i] = weekdays % 2;
         weekdays /=  2;
     }
     return tab
 }

另一个建议(小提琴) - 只是将chead23 的答案放在一个循环中:

HTML:

<input type="checkbox" id="mon" data-weight=1></td>
<input type="checkbox" id="tue" data-weight=2></td>
<input type="checkbox" id="wed" data-weight=4></td>
<input type="checkbox" id="thu" data-weight=8></td>
<input type="checkbox" id="fri" data-weight=16></td>
<input type="checkbox" id="sat" data-weight=32></td>
<input type="checkbox" id="sun" data-weight=64></td>

Javascript:

function getWeekDays() {
    var weekdays = 0;
    $('#table :checked').each(function () {
        weekdays += parseInt($(this).attr('data-weight'), 10);
    });
    return weekdays;
}

function setWeekDays(weekdays) {
    $('#table input[type="checkbox"]').each(function () {
        var i = this.getAttribute('data-weight');
        $(this).prop('checked', weekdays & i);
    });
}
于 2013-04-24T15:57:53.127 回答
0
let yourNumber = 343234729;
let decomposed = yourNumber.toString(2).split('').reverse().map((bit, index) => bit === '1' ? 1 << index : 0).filter(x => x > 0);
于 2015-12-12T18:36:26.443 回答