2009-09-22 3 views
3

var d = 7;Установка определенных битов в числе

в двоичной системе: 7 = (111)

То, что я хочу сделать, это установить второе место справа на 1 или 0 в распоряжении,

и возвращает десятичное значение.

Например, если я хочу, чтобы сделать второй от 1 до 0, то после того, как процесс должен возвращать 5,

потому, что 5 = (101).

Как реализовать это в javascript?

EDIT

ответ должен быть что-то вроде этого:

function func(decimal,n_from_right,zero_or_one) 
{ 

} 

Где десятичное число подлежащих обработке, n_from_right это сколько бит из правой, в моем примере выше это 2 . zero_or_one означает, что этот конкретный бит установлен в 0 или 1.

ответ

14

Самый простой способ очистить бит - это использовать и операцию с его битовым дополнением.

7 = 0000000000000111 
~2 = 1111111111111101 
& : 0000000000000101 

В коде:

var d = 7, mask = 2; 
d &= ~mask; 

Чтобы установить бит вместо очистки его, вы используете или оператор вместо:

d |= mask; 

Если вам нужно создать маску динамически обрабатывать разные биты, вы начинаете со значения один (двоичный 0000000000000001) и переводите бит в правильный индекс. Второй бит имеет индекс один (крайний правый бит имеет нулевой индекс), так что:

var index = 1; 
var mask = 1 << index; 
+0

+1 - отличный ответ, хорошо объясненный –

+0

Я не понимаю? '~ 2! == parseInt (" 1111111111111101 ", 2)' –

+0

@MichaelTheriot: я немного упростил ответ, побитовые операторы работают с 32-разрядными номерами, поэтому для получения более четкого 16-го значения. Однако цифры все еще не совпадают, потому что '~ 2' -' -3' и 'parseInt (" 11111111111111111111111111111101 ", 2)' is '4294967293'. Поскольку побитовые операторы работают с 32-битными номерами, а '4294967293' слишком велик, чтобы поместиться в 32 бита, он будет преобразован в' -3' в операции. (Ну, это действительно преобразуется в двоичное представление числа, но оно выдается как '-3' при обратном обращении.) – Guffa

0

попробуйте использовать bitshifting:

d &~(1<<1) 

смотри также this docs

10

Один из способов сделать это, но вы, вероятно, будет лучше, используя битовые операторы

var d = 7; 
var binary = d.toString(2); 

binary = binary.split(''); 
binary[1] = "0"; 
binary = binary.join(''); 
binary = parseInt(binary,2); 
+3

Я согласен поразрядным арифметическим c лучше, но +1 для указания относительно малоизвестного способа преобразования в/из двоичных строк. – bobince

0

Вы можете использовать Javascript bitwise operators :

var five = 7 & ~2; 

2 = 10 в двоичном формате

+0

Что означает ~ 2? – omg

+0

~ побитовое НЕ - https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Bitwise_Operators#.7e_%28Bitwise_NOT%29 –

1

Чтобы установить второй бит, просто ИЛИ с 2 (10 в двоичном)

var d=5; 
var mask=2; 
var second_bit_set=d | mask; 


      d: 101 
     mask: 010 
-------------------- 
bitwise OR: 111 

для удаления второго бит, вы хотите И со значением, которое имеет все биты, кроме второго. Простым способом построения этого значения является выполнение побитового NOT на значении, например.~ 2

var d=7; 
var mask=~2; 
var second_bit_unset=d & mask; 

      d: 111 
     mask: 101 
-------------------- 
bitwise AND: 101 

Смотрите это bitwise operator reference для получения дополнительной информации об этих операторах.

0
var str="XXX\tYYYYYYY\n"; 
for(var i=0;i<=7;i++){ 
str+=(i+8).toString(2).substring(1)+"\t"+(i*11+22+128).toString(2).substring(1); 
str+="\n"; 
} 
console.info(str); 

вы можете сделать FUNC из моего велосипеда

1

/** Преобразование десятичного числа в двоичную **/

var toBinary = function(decNum){ 
    return parseInt(decNum,10).toString(2); 
} 

/** Преобразование двоичного числа в десятичное **/

var toDecimal = function(binary) { 
    return parseInt(binary,2).toString(10); 
}